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

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

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

  

但是,如果我将用户ID和密码保留在Web.config ,那么显然存在一个明显的安全漏洞,尤其是在源代码控制下。

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

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

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

之前:

      

运行此命令:

 aspnet_regiis –pef connectionStrings c:\PathToWebSite 

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

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

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

后:

        Rsa Key   Bf677iFrUFW ... +4n4ZZKXCTUAu2Y=     UDEZ ...QfXUmM5rQ==    

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

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

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

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

常见方法包括加密web.config 并将连接字符串存储在注册表中 。

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

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