C# SQL 连接字符串最佳实践

Nor*_*acs 2 database sql-server authentication winforms

我有一个 winforms 应用程序,它使用连接字符串和通用用户连接到数据库

"Database=DBADAS;Server=TMT123\\SQLEXPRESS;User ID=user; Password=*****;
Run Code Online (Sandbox Code Playgroud)

通过登录对话框连接到数据库后,我们检查数据库的用户表中是否存在用户和密码。

我现在的问题是这是否是一个好的做法?因为基本上在连接字符串中包含了破解服务器所需的所有信息。

CDo*_*ove 5

有几种方法可以安全地解决这个问题。由于它是 Winforms 应用程序而不是 Web 应用程序,因此大多数安全风险都涉及网络中已有的人偷看连接字符串。这本身就增加了一层安全性。

1. 硬编码 您可以将用于获取用户的连接字符串硬编码到 DLL 中,并使您的应用程序依赖于该 DLL。我建议这样做只是因为听起来“通用用户”密码是永久性的;否则,每次更改密码时都必须重新编译代码,然后再次部署。然而,这是非常安全的,因为该值不是以纯文本形式存储的。

2. App.Config 您可以将其粘贴到配置文件中。在安全网络中,这可能是最通用的选项,因为您可以存储多个字符串并轻松更新它们,而无需更新完整的应用程序。这与“DebugMode”设置等设置很好地配合。使用 App.Config 或其他 XML 文件是理想的选择,但您也可以滚动快速且肮脏的 .txt 文件。

3. 数据库 可能是最安全的方法,因为您可以加密数据库并对程序进行编码,以使用不相关的登录名从该数据库获取连接字符串和登录信息。这允许在用户尚未登录时更好地控制应用程序可以访问的内容。它还可以防止软件在网络外部运行,这可能是理想的。

4. 内部 API 使用单独的应用程序来提供这些数据,可以将用户能力与您的担忧分开,因为 API 和您的应用程序可以交换验证密钥,以查看您的应用程序是否有权尝试连接。这是我个人最喜欢的,但显然是最需要设置的工作。

5. 注册表项 根据您的安装方式,将您需要的令牌嵌入到注册表中可能会很有效。这保证了应用程序需要管理员权限才能安装,并允许您使用 Windows 安全性来限制对配置单元的访问。

同样,由于它是一个内部非 Web 应用程序,因此我不会太担心连接字符串的纯文本;如果有人已经深入你的网络,那么你很可能已经遇到了更大的问题。我不会将其作为纯文本文件浮动在本地目录中,但任何高于此的安全程度对于您的目的来说可能都是可以接受的。