C# 正确存储SQL凭据
首先,这是一个教育性的问题——不是我在生产应用程序中实现的东西,因为我正在学习C#的基础知识 目前我有一个包含2个(实际上是3个,但有一个是单元测试)项目的解决方案C# 正确存储SQL凭据,c#,mysql,sql,class,class-library,C#,Mysql,Sql,Class,Class Library,首先,这是一个教育性的问题——不是我在生产应用程序中实现的东西,因为我正在学习C#的基础知识 目前我有一个包含2个(实际上是3个,但有一个是单元测试)项目的解决方案 形式 类库 在类库中,我有一个名为Database.cs的类,它与MySQL数据库通信。我不直接与这个Database.cs类通信,但类库中的其他类可以(例如Products.cs)。 不过,我需要凭据才能连接到这个MySQL数据库,我不确定该用哪种方式安全地连接 将其存储在类库中/在类中硬编码凭据 这对我来说没有意义,因为用户
- 形式
- 类库
Database.cs
的类,它与MySQL数据库通信。我不直接与这个Database.cs
类通信,但类库中的其他类可以(例如Products.cs
)。
不过,我需要凭据才能连接到这个MySQL数据库,我不确定该用哪种方式安全地连接
将其存储在类库中/在类中硬编码凭据
这对我来说没有意义,因为用户可以轻松地获取DLL,而且从技术上讲,他获得了数据库的凭据
将凭证通过表单传递给类(如Products.cs
),该类在初始化数据库对象时传递凭证
可以工作,尝试过,它的工作,但我不确定这是否是'整洁'的方式来做
编写包含具有凭据的属性的静态类
同样,如果我在类库中创建这个静态类,我与我的第一个示例基本相同。如果我想在表单
中创建这个静态类,我需要从我的类库中添加对表单项目的引用(不是我想要的方式)
我试着查找资料,但显然我做得不对。有没有其他方法可以做到这一点?首先,不要将凭据硬编码为代码,因为凭据往往会随着时间的推移而变化,这意味着每次SQL凭据发生变化时,您都必须重新编译和重新部署应用程序 通常,连接到数据库所需的所有信息都存储在应用程序配置文件中,格式为 如果您的应用程序是web应用程序,那么您就可以开始了,因为web.config(一个web应用程序配置文件)存储在web服务器上,永远不会提供给web请求。 但若你们的应用程序是windows窗体应用程序,那个么安全性考虑就意味着任何使用你们的应用程序的用户都可以窥视应用程序配置文件并获取凭据。如果是Microsoft SQL,我建议使用Windows身份验证。但使用MySQL,我想您注定要将用户名和密码存储到连接字符串中。那么我建议用它来保护你的连接线 另外,如果您的用户可以/必须对MySQL服务器进行身份验证(输入MySQL用户名和密码),那么您可以使用连接字符串模板,并用用户名和密码替换其中的某些部分:
app.config
不要硬编码您的凭据,因为这可能会导致问题,首先,如果您需要在稍后阶段更改数据库的登录凭据,那么您将不得不重新编译类库,其次,正如您所提到的,安全性将受到损害 将连接信息留给主应用程序而不是存储在数据层是一种很好的技术。重构数据层以在运行时接受连接字符串,此值需要由主应用程序传递给数据访问层 这样您可以获得两个优势:
我已经编辑了你的标题。请看“”,其中的共识是“不,他们不应该”。@johnsaunderssql也是一个标记。@bas:在这种情况下,它被用作形容词。什么样的证书?SQL凭据。@bas:通过这种技巧,“C#”没有被用作副词。“存储”如何?“储存”?“不起作用。”约翰理解这是有道理的。说服我:)
<connectionStrings>
<add name="MyApplication" connectionString="Location=myServerAddress;Data Source=myDataBase;User ID={0};Password={1};
Port=3306;Extended Properties=""""; />
</connectionStrings>
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