如何在 C# Web 应用程序中安全地存储数据库连接字符串?

How can I securely store a database connection string in a C# web application?

提问人:PowerCoder 提问时间:2/21/2023 最后编辑:PowerCoder 更新时间:2/22/2023 访问量:579

问:

我有一个 C# Web 应用程序,其数据库连接字符串保存在 web.config 文件中。此文件也是 git 存储库的一部分。如何保存连接字符串以防止其在不良参与者访问我的存储库时受到威胁?

加密文件会像这个老问题的答案一样解决我的问题吗? 如果是,如何在 .NET 中执行此操作?

C# asp.net sql-server 安全 连接字符串

评论

2赞 Aaron 2/21/2023
好吧,链接的问题给了你一种答案。为什么首先需要将带有凭据的 Web 配置推送到 git?通常,你会在生成过程中添加它们(使用 jenkins、azure dev ops 或其他方式),并且只在生产系统中使用它
1赞 Panagiotis Kanavos 2/21/2023
Using Windows Authentication is not really suitable for my projects as multiple web apps run on one web server and I would like to separate the access different applications have.您不必对所有应用程序使用相同的 Windows 帐户。事实上,您必须做额外的工作才能使用同一个帐户。首先,每个应用程序池都在其自己的虚拟服务帐户下运行。如果要使用域帐户,请为每个应用程序使用不同的 AD 帐户
0赞 Hugh W 2/21/2023
这(至少)是两个独立的问题合二为一。第一个问题段落是一个很好的独立问题。我建议你把这个问题编辑成这样。换句话说,如何在 git 中安全地存储机密。然后你有问题 2,它似乎是关于保护 web.config 文件(该文件是否需要以加密形式发送?可能还有一个关于如何向服务器进程提供凭据的单独问题 2b。我建议单独阅读这些主题,当然,如果您找不到需要的内容,请提出更多 SO 问题:)
1赞 PowerCoder 2/21/2023
@HughW 感谢您的评论。我编辑了我的问题,希望现在更清楚了。我只包括第二部分,因为我认为它可能是我问题的解决方案。
1赞 Aaron 2/22/2023
您可以在 Jenkins 中添加凭据 jenkins.io/doc/book/using/using-credentials 通常它们由用户名 + 密码组成。然后,可以在生成期间将这些变量注入到 web.config 文件中。

答:

-2赞 Amentos 2/21/2023 #1

你应该(正如我看到的我的项目)将其存储在launchSettings.json中。

例如

"environmentVariables": {
        "ConnectionStrings__MyDb":"Server=localhost\\SQLEXPRESS;Database=My;Trusted_Connection=True"
      },

此文件对于所有程序员都是不同的。

评论

0赞 Hugh W 2/21/2023
这没有解决问题中的部分,即如何保存连接字符串以防止它在不良参与者访问我的存储库时受到损害?
2赞 mason 2/21/2023
不是“你应该”这样做。解决这个问题的方法有很多种,说你应该做某事而不提及优点、缺点或替代方案是非常具有误导性的。
1赞 Hugh W 2/22/2023 #2

有许多工具可以在 Git 存储库中安全地存储机密,您将在此处找到一个很好的概述(存档 1存档 2),其中讨论了权衡。

在文章中提到的那些中,我只使用了 git-secret,它有这样的概要:

  1. git-secret加密文件并将其存储在存储库中,为每次提交提供更改历史记录。git
  2. git-secret除了提供适当的私钥(以允许解密)和用于解密所有机密文件外,不需要任何额外的部署操作。git secret reveal

至于如何向 ASP.NET 服务器提供密码的更广泛问题,这是一个很大的话题。我建议阅读指南保护 Microsoft 的连接字符串和其他配置信息

0赞 Hades 2/22/2023 #3

切勿将敏感数据或凭据提交到 fit 中。

您可以使用用户密码在本地工作。

部署到服务器或宿主环境时,应使用环境变量。

这还有一个额外的好处,即允许您在每个环境中设置不同的值。