C# MySQL连接实践

7
如果一个C#应用程序从客户端连接到mysql服务器,我该如何为连接存储mysql用户名/密码?如果我将其存储在配置文件或源代码中,它可能会被反向工程找到。不可能给所有用户提供MySql密码。
此外,我有一个应用程序的登录功能。如何强制要求用户通过登录过程,而不是反向工程并注释掉验证登录的C#代码?
是否有任何方法来管理MySql和客户端应用程序之间的这些连接,或者必须有第三个程序在服务器端与本地数据库交互才能安全?

有趣...我本来想将其标记为重复,但在SO上搜索却一无所获。这个问题似乎只被问到了ASP.NET,从未涉及Winform客户端。 - Paul Sasik
3个回答

3
也许你可以采用两阶段系统:创建一个只有执行存储过程权限的SQL账户,该存储过程需要输入用户的用户名和密码,并返回真实账户的凭据。当用户登录时,连接到受限账户,获取真实账户的凭据,然后使用该账户进行操作。你还可以定期更改SQL密码。如果怀疑用户存在不良行为,可以让存储过程返回不同的凭据,并跟踪这些凭据。

我认为我喜欢这个。这种解决方案是否存在潜在问题? - MattR
1
正如Paul Sasik所提到的,如果使用共享密码,则具有足够访问权限的用户可以获取该密码。因此,虽然这将减轻问题(只有已登录的用户才能找到SQL密码),但并不能消除它。要完全消除它,您需要在用户和数据库之间添加一些东西。 - Yuliy

2
对于直接连接数据库的Winform客户端来说,这是一个古老的(大约10年?)问题,可能永远无法解决。问题在于,无论你如何加密或混淆连接字符串,都会有一个时刻,该字符串将以明文形式表示在客户端计算机的内存中,因此可以被黑客攻击。其他SO用户已经向您推荐了选项,我只是想指出您正在尝试解决的问题。

1

这里有一个问题。您正在信任最终用户使用将调用MySQL查询的二进制文件。这意味着,毫无疑问,聪明的用户可以“掌控”并直接运行查询。

有一些事情可以做来改善情况。听起来您在局域网上。为什么不能为每个用户提供自己的数据库用户?这意味着(a)认证已经为您处理,并且(b)您可以使用“真正”的MySQL权限来限制他们可能造成的伤害。此外,您可以使用存储过程,并仅授予他们对过程的访问权限,从而真正限制他们的操作。

您还可以考虑将其重写为Web应用程序,在其中在服务器上处理所有内容,使其超出他们的范围。

但是,这里真的有问题吗,还是您只是在理论上思考?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接