正确存储SQL凭据

Roe*_*oel 7 c# mysql sql class-library class

首先,这是一个教育问题 - 我不是在生产应用程序中实现的,因为我正在学习C#的基础知识.

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

  • 形成
  • 班级图书馆

在类库中,我有一个名为的类Database.cs,它与MySQL数据库通信.我不直接与这个Database.cs类通信,但是类库中的其他类(例如Products.cs).虽然,我需要凭据连接到这个MySQL数据库,我不知道哪种方式可以安全地进行.

将其存储在类库中/对类中的凭据进行硬编码.

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

将凭证通过表单传递给类(如Products.cs),该类在初始化Database对象时传递它

可以工作,尝试,它的工作原理,但我不确定这是否是"最好的"方法.

编写一个包含带凭据的属性的静态类

同样,如果我在类库中创建这个静态类,我几乎和我的第一个例子不同.如果我要在其中创建这个静态类Form,我需要从我的类库中添加对Form-project的引用(不是我希望它的方式).

我试着查找东西,但我显然做得不对.有没有其他方法可以做到这一点?

Ram*_*nas 4

首先,永远不要将凭据硬编码到代码中,因为凭据往往会随着时间的推移而变化,这意味着每次 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>
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)