C# 如何从WPF应用程序安全地与数据库交互

C# 如何从WPF应用程序安全地与数据库交互,c#,database,wpf,entity-framework,security,C#,Database,Wpf,Entity Framework,Security,当我使用EntityFramework开发与在线MySQL数据库交互的WPF.NET核心应用程序时,我注意到,如果部署了我的应用程序,并且有人对其进行了代码反转,我绝对无法使用易于访问的连接字符串来保护我的数据库不被读取或修改 我搜索了一下,找到了以下几种可能的解决方案: 使用aspnet\u regiis将连接字符串存储在加密的app.config中(但是.NET Core似乎更倾向于.json配置文件,因此无法使用aspnet\u regiis进行加密) 使用c#obfuscator(如C

当我使用
EntityFramework
开发与在线MySQL数据库交互的WPF.NET核心应用程序时,我注意到,如果部署了我的应用程序,并且有人对其进行了代码反转,我绝对无法使用易于访问的连接字符串来保护我的数据库不被读取或修改

我搜索了一下,找到了以下几种可能的解决方案:

  • 使用
    aspnet\u regiis
    将连接字符串存储在加密的
    app.config
    中(但是.NET Core似乎更倾向于
    .json
    配置文件,因此无法使用
    aspnet\u regiis
    进行加密)
  • 使用c#obfuscator(如
    ConfuserEx
    )混淆源代码(如果我理解正确,这只会使连接字符串更难读取,但仍有可能获取它并弄乱数据库,对吗?)
  • 而是构建API并与之交互,从而对数据库进行更改(但即使如此,如何确保API请求真正来自我的WPF应用程序,而不是来自恶意用户?)
如果您对这些解决方案有更多的了解,或者可能有其他方法使连接到在线数据库更加安全,那么非常欢迎详细的步骤/链接

而是构建API并与API交互,从而对数据库进行更改

这将是建议的方法

(但即使如此,如何确保API请求确实来自我的WPF应用程序,而不是来自恶意用户?)

你真的不能

当您在公开的客户机应用程序中嵌入某种访问密钥或公共URL时,您基本上接受它可能被公开的事实。您应该假设恶意用户可以从客户端应用程序中提取密钥/URL,而不考虑任何混淆

服务可能会拒绝来自其认为滥用API的IP地址的请求,但仍需要处理这些请求


管理公共API并不是件小事。你可能想考虑在托管云中托管你的应用程序。

< P>经过一些研究和测试,我发现了防止恶意用户读取和干扰连接的数据库(即使访问连接字符串)的正确方法。是通过将我的应用程序限制为仅执行存储过程,以提供所需的最少数据。对于将读取或更改用户敏感数据的存储过程,也可以通过在其所需参数中包含用户的秘密令牌(用户注册时在SQL中生成的随机字符串)来实现


剩下的唯一问题是,如果黑客垃圾邮件请求尝试暴力强制(即使几乎不可能对非常长且安全的令牌进行暴力强制),它仍可能导致MySQL服务器过载甚至崩溃。为了防止这种情况发生,唯一的解决方案似乎是使用API。

一个选项是将配置密钥存储在环境变量中,并在代码中读取值。如果您有超级用户或内部授权人,您可以让用户注册用户名和密码。将这些存储在数据库中。一个人看了这些,决定他们是一个值得信任的用户,并授权这些。每个用户都有自己唯一的用户名和密码。为了降低网络嗅探的风险,可以使用登录来生成令牌。一条很长的随机串。这在一天内有效,并缓存在web服务器上。每个请求都会传递一个当天用户唯一的令牌。当然,除非用户与服务器位于同一个域中。在这种情况下,您可以使用他们的windows登录。