2011-11-22 55 views
10

我目前正在研究一个ASP.NET MVC网站,而且我已经到了需要将数据库集成到网站中的一个点。如何安全地存储和访问连接字符串详细信息?

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

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

但显然有一个明显的安全漏洞,如果我离开我的用户名和密码就在Web.config,特别是当它在源控制。

简而言之:如何保存我的连接字符串细节而不公开可见?

回答

15

最好的做法是加密连接字符串部分。使用ASPNET_REGIIS.EXE,它可以在不同的地方找到:

  • 开始 - 的Visual Studio - Visual Studio工具 - Visual Studio命令提示符
  • C:\ WINDOWS \ Microsoft.NET \框架\ 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”是该网站的ID为IIS报道。

后:

<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(); 
+0

完美!这正是我正在寻找的。 –

3

一种方法是使用任何集成安全的DB计划书,这样口令就不是一个问题。服务器可以直接访问服务器而不必使用密码,但是您必须设置一个只能从Web服务器本身访问的用户。

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

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

因此,下一步是抽象出数据库连接,使其位于Web服务器之外,通常的方法是拥有一个单独的进程来存储公开固定方法的业务逻辑(例如服务) - Web服务器只需调用完成该工作的服务并将数据返回给Web服务器代码。

如果黑客攻击你的web服务器,他们所能做的只是调用服务的方法,他们不会直接访问数据库,因此不会损坏或修改它。通常黑客对于服务方法是什么或做什么的暗示很少,并且服务会有相当数量的验证代码给所有的输入,所以黑客创建的消息(希望)会被拒绝。 (使用时间戳,计数器等尝试击败定制的消息到服务)。

这是我们用于高安全性系统的方法(使用标准操作系统安全机制,您可以通过更多的方式来保护链中的每个部分)。一旦我们的安全人员展示了IIS黑客攻击,并为他提供了一个具有管理权限的远程shell,那么这样做的理由就变得非常清楚了。无论你做什么来保护你的Web服务器上的配置是没有意义的,如果黑客得到的。(而且这个过程非常简单 - 既然是固定的,但是一直都有0天的漏洞利用)

1

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