正确存储SQL凭据

时间:2013-03-07 19:35:13

标签: c# mysql sql class class-library

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

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

  • 表格
  • 班级图书馆

在类库中我有一个名为Database.cs的类,它与MySQL数据库通信。我没有直接与这个Database.cs类进行通信,但是类库中的其他类也是如此(例如Products.cs)。 虽然,我需要凭据才能连接到这个MySQL数据库,但我不确定采用哪种方式安全地进行。

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

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

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

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

编写一个包含带凭据

的属性的静态类

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

我试过看东西,但我显然做得不对。还有其他办法吗?

2 个答案:

答案 0 :(得分:4)

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

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

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

此外,如果您的用户可以/必须对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 :(得分:1)

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

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

这样你就获得了两个优势:

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