7

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

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

  • 形式
  • 类库

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

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

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

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

可以工作,尝试过并且可以工作,但我不确定这是否是“最简洁”的方法。

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

同样,如果我在类库中创建这个静态类,我与我的第一个示例几乎不一样。如果我要在 中创建这个静态类Form,我需要从我的类库中添加对 Form-project 的引用(不是我想要的方式)。

我尝试查找内容,但显然我做得不对。有没有其他方法可以做到这一点?

4

2 回答 2

4

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

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

如果您的应用程序是 Web 应用程序,那么您就可以开始了,因为 web.config(一个 Web 应用程序配置文件)存储在 Web 服务器上,并且永远不会为 Web 请求提供服务。但是,如果您的应用程序是 Windows 窗体应用程序,那么安全考虑就意味着任何使用您的应用程序的用户都可以查看应用程序配置文件并获取凭据。如果是 Microsoft SQL,我建议使用 Windows 身份验证。但是对于 MySQL,我猜你注定将用户名和密码存储到连接字符串中。然后我建议通过加密来保护你的连接字符串。

此外,如果您的用户可以/必须对 MySQL 服务器进行身份验证(输入 MySQL 用户名和密码),那么您可以使用连接字符串模板并将其某些部分替换为用户名和密码:
ap​​p.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
于 2013-03-07T20:01:41.673 回答
1

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

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

这样,您将获得 2 个优势:

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