Есть ли способ заблокировать компиляцию слова (или RegEx) на C#?

Я храню все «секреты» моего проекта (ключи API, сведения о базе данных и т. д.) вне приложения и получаю к ним программный доступ — как в разработке, так и в производстве. Есть ли способ, учитывая список запрещенных строк, настроить Visual Studio так, чтобы она прекращала компиляцию, если она увидит одну из них?

Просто очень стараюсь не помещать их в репо (...снова).

Я просмотрел параметры в конфигурации редактора, но это не поможет.

Используйте только директивы препроцессора: Learn.microsoft.com/en-us/dotnet/csharp/language-reference/…

jdweng 25.06.2024 23:43

Вы можете сделать этот анализатор кода, написав... Learn.microsoft.com/en-us/dotnet/csharp/roslyn-sdk/tutorials‌​/…

Selvin 25.06.2024 23:53

Конечно, если я Джон-младший программист, человек, не знающий ваших секретов, и я случайно использую «s0m3b1gs3cr3t» в качестве строки в своем коде и получаю сообщение об ошибке, то вы раскрыли свой секрет.

Flydog57 26.06.2024 00:50

Перехватчик git будет лучшим выбором, если вы пытаетесь предотвратить саму фиксацию. Может быть, что-то вроде github.com/awslabs/git-secrets ?

Jeremy Lakeman 26.06.2024 03:30

Исключение времени компиляции поначалу может показаться хорошей идеей, но затем вы должны понимать, что если есть исключение времени компиляции, оно должно содержать сообщение, которое позволит вам понять проблему и исправить ее - и как написал @Flydog57 — единственный способ сделать это — раскрыть секрет разработчику, чего вам, вероятно, следует избегать.

Zohar Peled 26.06.2024 08:21

Хороший секрет криптографически случайен. Нет другого способа сопоставить случайное совпадение, кроме как указать секрет как то, что вам нужно. Это Уловка-22.

Enigmativity 26.06.2024 09:01
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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);
        }
  1. Как сказал Джереми, используйте git-крючок.

Другие вопросы по теме