Безопасное создание нового экземпляра EF Core DbContext

#c# #security #.net-core #entity-framework-core

#c# #Безопасность #.net-core #entity-framework-core

Вопрос:

Иногда в .NET Core бывают случаи, когда требуется более одного DbContext (параллельные запросы к базе данных и т. Д.).

Было бы безопасно иметь любое из этих двух решений в моем классе DbContext?

     private static string _connectionString;

    private static string ConnectionString => 
        _connectionString ??= new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .Build().GetConnectionString("CoreConnection");

    public static CoreContext GetContext()
    {
        var options = new DbContextOptionsBuilder<CoreContext>()
            .UseNpgsql(ConnectionString)
            .Options;

        return new CoreContext(options);
    }
 

или

     private static IConfiguration _configuration;

    private static IConfiguration Configuration =>
        _configuration ??= new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .Build();

    private static string ConnectionString => 
        Configuration.GetConnectionString("CoreConnection");

    public static CoreContext GetContext()
    {
        var options = new DbContextOptionsBuilder<CoreContext>()
            .UseNpgsql(ConnectionString)
            .Options;

        return new CoreContext(options);
    }
 

Я прочитал (для старого ASP .NET), что вам следует избегать хранения конфиденциальных данных, таких как пароли и строки подключения, содержащие пароли, в памяти приложения в виде обычного текста, поскольку память может быть взломана или сброшена / сохранена после сбоя.

Это все еще верно для .NET Core? (думаю, так и должно быть)

Безопаснее ли его использовать IConfiguration или он также хранит строку подключения в виде обычного текста в памяти?

Является ли глобальный IConfiguration , который можно использовать с DI в net core, хранящим все appsettings.json данные файла в памяти?

Является ли более вероятным, что память будет взломана, тогда хакер сможет appsettings.json вместо этого напрямую считывать информацию?

Ответ №1:

Я думаю, это может помочь.

Очень важно утилизировать DbContext после использования. Это гарантирует как освобождение любых неуправляемых ресурсов, так и незарегистрированность любых событий или других перехватов, чтобы предотвратить утечки памяти в случае, если на экземпляр остается ссылка. DbContext не является потокобезопасным. Не разделяйте контексты между потоками. Перед продолжением использования экземпляра контекста убедитесь, что все асинхронные вызовы ожидаются. Исключение InvalidOperationException, вызванное кодом ядра EF, может перевести контекст в состояние, которое невозможно восстановить. Такие исключения указывают на программную ошибку и не предназначены для восстановления.

https://docs.microsoft.com/en-us/ef/core/dbcontext-configuration/

Это также может помочь:

Никогда не храните пароли или другие конфиденциальные данные в исходном коде.

https://docs.microsoft.com/en-us/aspnet/core/security/app-secrets?view=aspnetcore-5.0amp;tabs=windows