正确存储SQL凭据

本文关键字:凭据 SQL 存储 | 更新日期: 2023-09-27 18:02:44

首先,这是一个教育性的问题——因为我正在学习c#的基础知识,所以我不会在生产应用程序中实现它。

目前我有一个包含2个(实际上是3个,但其中一个是单元测试)项目的解决方案;

  • 类库

在类库中,我有一个叫做Database.cs的类,它与MySQL数据库通信。我不直接与这个Database.cs类通信,但类库中的其他类(例如Products.cs)。虽然,我需要凭据连接到这个MySQL数据库,我不确定哪一种方式去做安全。

将其存储在类库中/将凭证硬编码在类中

这对我来说没有意义,因为用户可以很容易地获取DLL,并且他在技术上获得了数据库的凭据。

将凭据通过表单传递给类(如Products.cs),该类在初始化数据库对象

时传递凭据

可以工作,试过了,但我不确定这是否是"最简洁"的方法。

编写一个静态类,其中包含凭据

的属性再一次,如果我在类库中创建这个静态类,我几乎与第一个例子不一样。如果我要在Form中创建这个静态类,我需要从我的类库中添加对表单项目的引用(不是我想要的方式)。

我试着找东西,但我显然没有做对。还有别的办法吗?

正确存储SQL凭据

首先,永远不要将凭据硬编码为代码,因为凭据往往会随着时间的推移而变化,这意味着每次SQL凭据发生变化时,您都必须重新编译和重新部署应用程序。

通常连接数据库所需的所有信息都以连接字符串的形式存储在应用程序配置文件中。

如果你的应用程序是web应用程序,那么你很好,因为web。Config(一个web应用程序配置文件)存储在web服务器上,永远不会提供给web请求。但如果你的应用程序是windows窗体应用程序,那么安全问题就会出现,这意味着任何使用你的应用程序的用户都可能窥探到应用程序的配置文件并获得凭据。如果是Microsoft SQL,我会建议使用Windows身份验证。但是对于MySQL,我猜你注定要将用户名和密码存储到连接字符串中。那么我建议通过加密来保护您的连接字符串。

同样,如果你的用户可以/必须对MySQL服务器进行身份验证(输入MySQL用户名和密码),那么你可以使用连接字符串模板并用用户名和密码替换它的某些部分:
app.config

<connectionStrings>
    <add name="MyApplication" connectionString="Location=myServerAddress;Data Source=myDataBase;User ID={0};Password={1};
Port=3306;Extended Properties=""""; />
  </connectionStrings>

c#代码

var username = textboxUsername.Text;
var password = textboxPassword.Text;
var connectionString = string.Format(ConfigurationManager.ConnectionStrings["MyApplication"].ConnectionString, username, password)
// at this point you have a connection string whitch could be passed to your Products class

不要硬编码您的凭据,因为这可能会导致问题,首先,如果您需要在稍后阶段更改数据库的登录凭据,那么您将不得不重新编译您的类库,其次,正如您提到的安全性将受到损害。

将连接信息留给主应用程序而不是存储在数据层中是一种很好的技术。重构数据层以在运行时接受连接字符串,此值需要由主应用程序传递给数据访问层。

这样做有两个好处:

  1. 在部署应用程序时,部署的位置可以具有与开发环境不同的连接凭据
  2. 您可以在配置文件中加密连接字符串以提高安全性