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

我目前正在开发一个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,它可以在各种地方找到:

  • 开始 - 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();
    

    一种方法是使用你的数据库提供的任何集成安全性,所以密码不是问题。 服务器可以直接访问服务器而不必使用密码,但是您必须设置一个只能从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?