Я храню все «секреты» моего проекта (ключи API, сведения о базе данных и т. д.) вне приложения и получаю к ним программный доступ — как в разработке, так и в производстве. Есть ли способ, учитывая список запрещенных строк, настроить Visual Studio так, чтобы она прекращала компиляцию, если она увидит одну из них?
Просто очень стараюсь не помещать их в репо (...снова).
Я просмотрел параметры в конфигурации редактора, но это не поможет.
Вы можете сделать этот анализатор кода, написав... Learn.microsoft.com/en-us/dotnet/csharp/roslyn-sdk/tutorials/…
Конечно, если я Джон-младший программист, человек, не знающий ваших секретов, и я случайно использую «s0m3b1gs3cr3t» в качестве строки в своем коде и получаю сообщение об ошибке, то вы раскрыли свой секрет.
Перехватчик git будет лучшим выбором, если вы пытаетесь предотвратить саму фиксацию. Может быть, что-то вроде github.com/awslabs/git-secrets ?
Исключение времени компиляции поначалу может показаться хорошей идеей, но затем вы должны понимать, что если есть исключение времени компиляции, оно должно содержать сообщение, которое позволит вам понять проблему и исправить ее - и как написал @Flydog57 — единственный способ сделать это — раскрыть секрет разработчику, чего вам, вероятно, следует избегать.
Хороший секрет криптографически случайен. Нет другого способа сопоставить случайное совпадение, кроме как указать секрет как то, что вам нужно. Это Уловка-22.
1. Вы можете использовать событие предварительной сборки для вызова простого скрипта для проверки наличия файлов cs.
2.Индивидуальный Анализатор Roslyn.
private static readonly DiagnosticDescriptor Rule = new DiagnosticDescriptor(DiagnosticId, Title, MessageFormat, Category, DiagnosticSeverity.Error, isEnabledByDefault: true, description: Description);
public override void Initialize(AnalysisContext context)
{
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
context.EnableConcurrentExecution();
context.RegisterSyntaxNodeAction(AnalyzeNode, SyntaxKind.StringLiteralExpression);
}
private void AnalyzeNode(SyntaxNodeAnalysisContext context)
{
var literalExpression = (LiteralExpressionSyntax)context.Node;
var literalValue = literalExpression.Token.ValueText;
// Case insensitive check for "password" substring
if (literalValue.IndexOf("password", StringComparison.OrdinalIgnoreCase) >= 0)
{
var diagnostic = Diagnostic.Create(Rule, literalExpression.GetLocation(), literalValue);
context.ReportDiagnostic(diagnostic);
}
}
Модульный тест:
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Threading.Tasks;
using VerifyCS = Analyzer1.Test.CSharpCodeFixVerifier<
Analyzer1.Analyzer1Analyzer,
Analyzer1.Analyzer1CodeFixProvider>;
namespace Analyzer1.Test
{
[TestClass]
public class Analyzer1UnitTest
{
//No diagnostics expected to show up
[TestMethod]
public async Task TestMethod1()
{
var test = @"
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
namespace ConsoleApplication1
{
class {|#0:TypeName|}
{
public string str = ""123password123"";
}
}";
await VerifyCS.VerifyAnalyzerAsync(test);
}
Используйте только директивы препроцессора: Learn.microsoft.com/en-us/dotnet/csharp/language-reference/…