如何安全地存储和访问连接字符串详细信息?

时间:2011-11-22 17:16:33

标签: c# asp.net-mvc-3 database-connection connection-string

我目前正在开发一个ASP.NET MVC网站,我已经达到了需要将数据库集成到网站中的程度。

通常我只需将适当的连接字符串添加到Web.config文件中:

<add name="MainDB" 
    connectionString="Server=localhost; Database=TopSecretData; User Id=Joe;
    password=password" providerName="System.Data.SqlClient" />

但是,如果我将用户ID和密码保留在Web.config中,显然存在明显的安全漏洞,尤其是在源代码管理下。

简而言之:如何在不公开显示连接字符串详细信息的情况下存储它?

5 个答案:

答案 0 :(得分:16)

最佳做法是加密连接字符串部分。使用aspnet_regiis.exe,它可以在各个地方找到:

  • 开始 - Visual Studio - Visual Studio工具 - Visual Studio命令提示符
  • C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319(确保以管理员身份运行)

在:

<configuration>
<connectionStrings>
<add name="MainConnectionString" 
 connectionString="data source=Ratbert;database=Sales;username=ASPNET;password=$Double_Rainbow2011" 
 providerName="System.Data.SqlClient"/>
</connectionStrings>
</configuration>

运行此命令:

aspnet_regiis –pef connectionStrings c:\PathToWebSite

或者,如果上述命令不起作用(并且您获得了aspnet_regiis帮助文本),请尝试

aspnet_regiis -pe connectionStrings -app "/" -site 6

其中“6”是IIS中报告的站点ID。

后:

<connectionStrings configProtectionProvider="RsaProtectedConfigurationProvider">
  <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
   xmlns="http://www.w3.org/2001/04/xmlenc#">
   <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
   <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
    <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
     <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
     <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
      <KeyName>Rsa Key</KeyName>
     </KeyInfo>
     <CipherData>
      <CipherValue>Bf677iFrUFW ... +4n4ZZKXCTUAu2Y=</CipherValue>
     </CipherData>
    </EncryptedKey>
   </KeyInfo>
   <CipherData>
    <CipherValue>UDEZ ...QfXUmM5rQ==</CipherValue>
   </CipherData>
  </EncryptedData>
 </connectionStrings>

现在它是乱码,你无法编辑它。 像这样解密:

aspnet_regiis –pdf connectionStrings c:\PathToWebSite

或者

aspnet_regiis -pd connectionStrings -app "/" -site 6

然后更改并重新加密。

要读取连接字符串,请使用ConfigurationManager静态类。

string connStr = 
ConfigurationManager
.Connectionstrings["MainConnectionString"]
.ConnectionString.ToString();

var myConnection = new SqlConnection(connStr);

myConnection.Open();

答案 1 :(得分:3)

一种方法是使用数据库提供的任何集成安全性,因此密码不是问题。服务器无需使用密码即可直接访问服务器,但您必须设置只能从Web服务器本身访问的用户。

例如。像MySQL这样的数据库允许您指定哪些服务器可以访问它,限制来自其他任何地方的访问 - 因此除了Web服务器之外,黑客无法访问您的数据库。这会大大降低安全性,并允许您将连接字符串文件存储在SCM中。

它仍然不是100%安全,因为黑客可以(通常很容易)破解您的Web服务器并从中查看数据库。您可以将密码存储在其他位置,但这只是模糊了问题 - 如果Web服务器可以访问密码,您的黑客也可以。 (注意,存储密码的其他地方包括注册表,单独的文件,如.udl文件或/ etc中的某些内容)。您可以保护此文件,以便只有Web服务器用户可以读取它,但是被黑客入侵的Web服务器显然可以阅读它!

所以下一步是抽象数据库连接,使其在Web服务器之外,通常的方法是有一个单独的进程来存储暴露固定方法的业务逻辑(例如服务) - Web服务器只是调用执行工作并将数据返回到Web服务器代码的服务。

如果黑客击败您的网络服务器,他们所能做的就是调用服务上的方法,他们无法直接访问数据库,因此无法破坏或修改它。通常,黑客对提供的服务方法或提供的内容几乎没有什么提示,并且该服务对所有输入都有相当数量的验证代码,因此黑客创建的消息(希望)会被拒绝。 (使用时间戳,计数器等尝试击败自定义消息到服务)。

这是我们用于高安全性系统的方法(使用标准操作系统安全机制,您可以采取更多措施来保护此链的每个部分)。一旦我们的安全人员证明了IIS黑客入侵给了他一个具有管理员权限的远程shell,我们就会明白这样做的原因。无论你做什么来保护你在网络服务器上的配置是没有意义的,如果一个黑客得到它。 (并且它很容易做到 - 自修复以来,但总有0天的漏洞被发现)

答案 2 :(得分:2)

也许你想研究加密你的连接字符串: http://chiragrdarji.wordpress.com/2008/08/11/how-to-encrypt-connection-string-in-webconfig/ (文章有点旧)

答案 3 :(得分:1)

常见方法包括encrypting the web.configstoring the connection strings in the registry

第二个链接是一篇更大的文章的一部分,内容涉及如何正确保护ASP.NET应用程序。它是为WebForms编写的,但原理是相同的。这是一个很好的阅读,今天仍然适用,即使它有点旧。

答案 4 :(得分:1)

您可以在缓存中存储加密连接字符串。高速缓存服务器故意在另一台服务器上(此通信可以限制为1端口,IP地址更难被黑客攻击)。这将使连接字符串完全脱离Web服务器,即使黑客可以访问缓存,也会加密。关键是将字符串加载到缓存中并且可以远程完成,因此这些连接字符串永远不会写入服务器的硬盘驱动器。代码只根据需要解密连接字符串,并且永远不会保留变量中那些未加密的字符串。