【问题标题】:How can I safely store and access connection string details?如何安全地存储和访问连接字符串详细信息?
【发布时间】:2011-11-22 17:16:33
【问题描述】:

我目前正在开发一个 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 中,显然存在明显的安全漏洞,尤其是在它处于源代码控制之下时。

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

【问题讨论】:

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


    【解决方案1】:

    最佳做法是加密您的连接字符串部分。使用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();
    

    【讨论】:

    • 完美!这正是我想要的。
    【解决方案2】:

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

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

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

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

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

    这是我们用于高安全性系统的方法(您可以做很多事情来使用标准操作系统安全机制来保护该链的每个部分)。一旦我们的安全人员演示了一个 IIS hack,它给了他一个具有管理员权限的远程 shell,我们就非常清楚这样做的原因。如果黑客知道了,无论您为保护 Web 服务器上的配置所做的任何事情都是毫无意义的。 (而且这很容易做到 - 自从修复以来,但总是发现 0-day 漏洞)

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2011-03-14
            • 1970-01-01
            • 1970-01-01
            • 2018-05-06
            • 1970-01-01
            • 1970-01-01
            • 2012-01-17
            • 1970-01-01
            • 2011-03-27
            相关资源
            最近更新 更多