如何安全地存储和访问连接字符串详细信息?
我目前正在开发一个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
,尤其是在源代码控制之下,那么显然存在明显的安全漏洞。
简而言之:我怎样才能存储我的连接字符串的细节,而不公开可见?
最佳做法是加密连接字符串部分。 使用aspnet_regiis.exe,它可以在各种地方找到:
之前:
<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();
一种方法是使用你的数据库提供的任何集成安全性,所以密码不是问题。 服务器可以直接访问服务器而不必使用密码,但是您必须设置一个只能从Web服务器本身访问的用户。
例如。 像MySQL这样的数据库允许你指定哪些服务器可以访问它,限制其他任何地方的访问 - 所以黑客无法从Web服务器上访问数据库。 这大大降低了安全性,并允许您将连接字符串文件存储在SCM中。
它仍然不是100%安全的,因为黑客可以(通常很容易)攻击你的web服务器并从中查看数据库。 您可以在其他地方存储密码,但这只是掩盖了问题 - 如果Web服务器可以访问密码,您的黑客也可以。 (注意,存储密码的其他地方包括注册表,单独的文件如.udl文件或/ etc中的某个文件)。 您可以保护此文件,以便只有Web服务器用户才能读取它,但显然,被黑客入侵的Web服务器可以读取它!
因此,下一步是抽象数据库连接,使其不在Web服务器中,通常的方法是有一个单独的进程来存储公开固定方法的业务逻辑(例如服务) - Web服务器只需调用服务即可完成工作并将数据返回到Web服务器代码。
如果黑客攻击你的Web服务器,他们所能做的只是调用服务的方法,他们不能直接访问数据库,所以不能破坏或修改它。 通常黑客对于服务方法是什么或做什么的暗示很少,并且服务会有相当数量的验证代码给所有的输入,所以黑客创建的消息(希望)会被拒绝。 (使用时间戳,计数器等尝试击败定制的消息到服务)。
这是我们用于高安全性系统的方法(使用标准的操作系统安全机制,您可以做更多的事来保护链中的每个部分)。 一旦我们的安全人员展示了IIS黑客攻击,并为他提供了一个具有管理权限的远程shell,那么这样做的理由就变得非常清楚了。 无论你做什么来保护你的Web服务器上的配置是没有意义的,如果黑客得到的。 (而且这很容易做 - 因为固定的,但一直都有0天的漏洞利用)
也许你想看看加密连接字符串:http://chiragrdarji.wordpress.com/2008/08/11/how-to-encrypt-connection-string-in-webconfig/(文章有点旧)
链接地址: http://www.djcxy.com/p/70367.html上一篇: How can I safely store and access connection string details?
下一篇: Wildcard subdomains in IIS7. Is it possible to make them like it is in Apache?