Каков правильный метод для шифрования ASP.NET ConnetionStrings? - PullRequest
3 голосов
/ 22 февраля 2011

Я просматривал несколько примеров шифрования connectionStrings (Web.config) в приложении ASP.NET MVC (.NET 4.0), и кажется, что есть два основных способа добиться этого ( пример 1 и соответствующий пример 2 ):

Используйте инструмент aspnet_regiis.

Основная проблема с использованием aspnet_regiis заключается в том, что я могу запускать инструмент локально (на моей машине для разработки), но веб-сайт на самом деле размещен на Arvixe и, как и на любом другом веб-хосте: нет способа запускать команды на сервере. Насколько я понимаю, если я зашифрую строки соединения Web.config на своем компьютере и опубликую файл Web.config, их невозможно будет расшифровать на сервере (исправьте, если это не так).

Примечание: я использовал только RSAProtectedConfigurationProvider, но я предполагаю, что DataProtectionConfigurationProvider будет иметь ту же проблему, так как это зависит от пользователя / машины.

Программно зашифровать строку подключения.

Программное шифрование connectionStrings также имеет недостаток: каждый раз, когда я публикую свой веб-сайт, обновляется Web.config (с незашифрованными connectionStrings), и это означает, что в течение некоторого периода времени Web.config не будет зашифрован. Даже если я гарантирую, что файл Web.config публикуется только при наличии изменений в нем, проблема может быть сведена к минимуму, но не уменьшена.

Я подумал, что использование статического класса может помочь сократить время, когда строки соединений не шифруются. К сожалению, для шифрования connectionStrings требуется путь к приложению, и кажется, что единственный способ получить путь к приложению - это запрос (Request.ApplicationPath), а в статическом классе (очевидно) нет запроса.

private void ProtectSection(string sectionName,
                                   string provider)
{
    Configuration config =
        WebConfigurationManager.
            OpenWebConfiguration(Request.ApplicationPath);

    ConfigurationSection section =
                 config.GetSection(sectionName);

    if (section != null &&
              !section.SectionInformation.IsProtected)
    {
        section.SectionInformation.ProtectSection(provider);
        config.Save();
    }
}

private void UnProtectSection(string sectionName)
{
    Configuration config =
        WebConfigurationManager.
            OpenWebConfiguration(Request.ApplicationPath);

    ConfigurationSection section =
              config.GetSection(sectionName);

    if (section != null &&
          section.SectionInformation.IsProtected)
    {
        section.SectionInformation.UnprotectSection();
        config.Save();
    }
}

UnProtectSection("appSettings");

ProtectSection("appSettings",
    "DataProtectionConfigurationProvider");

Как правильно зашифровать connectionString и устранить / уменьшить количество времени, в течение которого раздел Web.config не шифруется? Вы пишете какой-то тип оболочки вокруг метода OpenWebConfiguration, который проверяет, зашифрован ли раздел, и использует только эту оболочку? Пользователи могут получить доступ к любой странице на вашем веб-сайте, так как вы откладываете шифрование до тех пор, пока не запросите некоторые данные из базы данных, или вы проверите, зашифровано ли оно при первой возможности?

Ответы [ 3 ]

3 голосов
/ 22 февраля 2011

Самый простой способ использования совместно используемого хостера - написать собственную утилиту шифрования / дешифрования и сохранить строку подключения либо в настройках приложения, либо в пользовательском XML-файле, либо в текстовом файле, чтобы у вас был полный контроль над шифрованием. / процесс расшифровки ...

За ваше обновление вы можете получить текущий запрос через:

new HttpRequestWrapper(System.Web.HttpContext.Current.Request);

НТН.

0 голосов
/ 13 декабря 2017

Получить ConnectionString из Web.config Файл

Прежде чем начать читать или получать строку подключения из файла web.config, вы должны знать, как получить строку подключения для подключения к вашей базе данных, которая покажет вам также разницу, почему я не использовал идентификатор пользователя и пароль в моем Строка подключения. Узнав об этом, вы можете настроить строку подключения в web.config следующим образом.

<connectionStrings>
   <add name="myDbConnection" providerName="System.Data.SqlClient"
   connectionString="Data Source=myServer;Integrated Security=true;Initial Catalog=myDatabase"/>
</connectionStrings>

Чтобы прочитать или получить строку подключения из файла web.config в asp.net, нам нужно добавить пространство имен System.Configuration, которое поможет нам прочитать строку подключения.

Примечание. Если вы определили строку подключения в разделе appSettings, вы можете получить строку подключения из раздела appSettings следующим образом. Считать строку подключения в C #

protected void Page_Load(object sender, EventArgs e)
{
       string con = System.Configuration.ConfigurationManager.ConnectionStrings["myDbConnection"].ConnectionString;
}

Считать строку подключения в Vb.net

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
       Dim con As String = System.Configuration.ConfigurationManager.ConnectionStrings("myDbConnection").ConnectionString
End Sub

Пример: простая вставка, обновление и удаление в Asp.net Вам также может понравиться вставить, обновить и удалить на asp.net gridview здесь. Вот и все, теперь вы сможете получить строку подключения из файла web.config и использовать его в любом месте.

Вы можете узнать больше на asp.net через http://www.aspneto.com/category/aspnet/

0 голосов
/ 22 февраля 2011

Я придумала собственное решение, но надеюсь, что есть лучший способ сделать это:

internal static class SecurityExtension
{
    public static string GetConnetionString(this Configuration config, string databaseName, string provider = "RSAProtectedConfigurationProvider")
    {
        string sectionName = "connectionStrings";
        ConfigurationSection section = config.GetSection(sectionName);
        if (section != null && !section.SectionInformation.IsProtected)
        {
            section.SectionInformation.ProtectSection(provider);
            config.Save();
        }

        return WebConfigurationManager.ConnectionStrings[databaseName].ConnectionString;
    }
}

Теперь мне просто нужно использовать расширение каждый раз, когда я хочу получить строку конфигурации:

Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
string connectionString = config.GetConnetionString("MyDatabaseName");

Обновление:
Благодаря Брайану, мы можем статически получить строку подключения:

private static HttpRequestWrapper request = new HttpRequestWrapper(System.Web.HttpContext.Current.Request);
private static Configuration config = WebConfigurationManager.OpenWebConfiguration(request.ApplicationPath);
private static string connectionString = config.GetConnetionString("MyDatabaseName"));

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

...