我在我的 C# 项目中使用 MySQL 连接器来直接连接到数据库以存储统计信息。我的问题是,如果我发布这个项目并且有人愿意尝试访问我的数据库,他们可以从软件中获取到我的数据库的连接字符串吗?我正在使用 SQL 连接器,因此我可以实时保存数据而不会生成大量 HTTP 请求,对于那些想知道为什么不直接在 HTTP 请求中发送数据的人。
3 回答
是的,如果他们会反编译您的应用程序。您可以混淆您的应用程序(我不喜欢这样做。它可能会损坏您的应用程序。但如果您这样做,互联网上有很多混淆器。)。对我来说,最好的方法是创建一个Settings
文件,其中包含加密字符串,例如数据库名称、位置、用户名和密码。
总是可以从可执行文件中提取纯文本字符串,但并不总是可行的。如果您想稍微加强安全性,请考虑以下几点:
- 通过将连接字符串(或只是密码)分段存储在您的应用程序中来混淆它,但这可能并不漂亮。
- 限制您硬编码到应用程序中的用户的访问权限
- 存储加密的密码,如果密钥存储在应用程序中,这仍然只是混淆(.NET 加密库中有一个不错的 AES 库。)
是的。这就是他们鼓励 N-Tier 方法的原因。您的应用程序应该通过 .NET Web 服务、WCF 服务、RIA 服务等。然后您的服务将访问数据库并从数据库中编辑、插入、选择数据。当然,您的服务将负责某种类型的身份验证过程并确定哪些角色和功能可用。例如,某些登录可能只有对 Orders 表的读取权限。有些人可能拥有完整的读/写/编辑管理员权限。一些登录可能只有对客户表的读取权限,甚至可能只有对他们自己的客户记录等的读取权限。
您永远不想将您的数据库登录凭据暴露给您自己网络之外的任何东西。即使您正在使用混淆或加密,如果您的应用程序在某些时候直接连接到数据库,它也必须发送这些凭据,这使黑客有机会拦截或捕获这些值。
通过使用 N 层架构,用户可以知道不是他们自己的登录名/用户名,以便获得更多特权。即使通过 SSL 谁关心他们是否破解如何使用他们自己的用户名/密码访问网络服务,如果它没有给他们任何比通过您的程序更多的访问权限,那也没什么大不了的。他们必须学习/窃取别人的密码,也许是管理员用户名/密码,您可以通过每月更改一次来轻松修复。
您提到在 HTTP 请求中发送连接字符串。一旦有人破解,您可以随心所欲地更改您的数据库用户名/密码,但他们已经知道如何破解它。换句话说,永远不要将您的 sa/DBowner 用户名密码放在您的应用程序中。为了使其安全,您需要通过某种类型的 Web 服务,该服务需要用户名和密码,并负责确定用户的权限。该服务应该在您自己的网络上,因此他们必须破解 Web 服务器或 IIS 才能真正侵入您的数据库。
有些人甚至会在 web 服务的配置文件中加密数据库的用户名/密码,但除非您在一家大型公司工作,许多管理员可以访问配置文件但只有少数几个管理员,否则这并不是必需的应该可以访问数据库。在我看来,配置文件中的纯文本很好,除非数据非常敏感,并且您有多个人能够访问不应该知道用户名/密码的配置文件。关键在于,只有贵公司中的人才能访问配置文件……运行不在贵公司中的应用程序的普通 joe 永远不应该有任何方法得到这个,除非他们物理侵入您的 IIS 服务器...在这种情况下,您会遇到更大的问题。