Я просматривал несколько примеров шифрования 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
, который проверяет, зашифрован ли раздел, и использует только эту оболочку? Пользователи могут получить доступ к любой странице на вашем веб-сайте, так как вы откладываете шифрование до тех пор, пока не запросите некоторые данные из базы данных, или вы проверите, зашифровано ли оно при первой возможности?