如何从 WPF 应用程序安全可靠地与数据库交互
Posted
技术标签:
【中文标题】如何从 WPF 应用程序安全可靠地与数据库交互【英文标题】:How to safely and securely interact with a Database from a WPF App 【发布时间】:2020-12-25 22:08:56 【问题描述】:当我使用 EntityFramework
开发一个与在线 MySQL 数据库 交互的 WPF .NET Core 应用程序时,我注意到我完全没有办法保护我的数据库免受如果我的应用已部署并且有人代码将其反转,则使用易于访问的连接字符串读取或修改。
我搜索了一下,发现了以下几个可能的解决方案:
使用aspnet_regiis
将连接字符串存储在加密的app.config
中(但.NET Core 似乎更倾向于.json
配置文件,因此无法使用aspnet_regiis
加密)
使用像 ConfuserEx
这样的 c# 混淆器对源代码进行混淆 (如果我理解正确,它只会使连接字符串更难阅读,但仍然有可能得到它并弄乱数据库,对吧?)时间>
构建 API 并与之交互,而不是对数据库进行更改(但即便如此,如何确保 API 请求真正来自我的 WPF 应用程序而不是来自恶意用户?)
如果您对这些解决方案有更多了解,或者可能有其他方法可以确保安全地连接到在线数据库,欢迎提供详细的步骤/链接!
【问题讨论】:
一种选择是将配置键存储在环境变量中,然后读出代码中的值。 如果您有超级用户或内部授权人,您可以让用户注册用户名和密码。将这些存储在您的数据库中。一个人查看这些并确定他们是受信任的用户并授权这些。然后,每个用户都有自己唯一的用户名和密码。为了降低网络嗅探的风险,可以使用登录来生成令牌。一个长的随机字符串。这一天有效并缓存在 Web 服务器上。每个请求都会传递一个当天用户唯一的令牌。 当然,除非用户与服务器在同一个域中。在这种情况下,您可以使用他们的 windows 登录。 【参考方案1】:构建 API 并与之交互,而不是对数据库进行更改
这是推荐的方法。
(但即便如此,如何确保 API 请求真正来自我的 WPF 应用程序,而不是来自恶意用户?)
你真的不能。
当您将某种访问密钥或公共 URL 嵌入到您公开公开的客户端应用程序中时,您基本上接受了它可能被公开的事实。您应该假设恶意用户可以从客户端应用程序中提取密钥/URL,而不考虑任何混淆。
服务可能会拒绝来自其认为滥用 API 的 IP 地址的请求,但仍需要处理这些请求。
管理公共 API 并非易事。您可能需要考虑将您的应用托管在托管云中。
【讨论】:
【参考方案2】:经过一些研究和测试,我发现防止恶意用户读取和弄乱连接的数据库的正确方法(即使他可以访问连接字符串)是将我的应用程序限制为仅执行存储过程,这将提供所需的最少数据。对于将读取或更改用户敏感数据的存储过程,还可以通过在其所需参数中包含用户的秘密令牌,这将是用户注册时在 SQL 中生成的随机字符串。
剩下的唯一问题是,如果黑客发送垃圾邮件请求以尝试暴力破解(即使几乎不可能暴力破解一个非常长且安全的令牌),它仍然可能使 mysql 服务器过载甚至崩溃。为了防止这种情况发生,唯一的解决方案似乎是使用 API。
【讨论】:
以上是关于如何从 WPF 应用程序安全可靠地与数据库交互的主要内容,如果未能解决你的问题,请参考以下文章
是否可以从 WinForm/WPF C# App 与 Web 浏览器进行交互?