我需要为公司创建一个应用程序,他们希望让人们登录到该应用程序,以便具有执行不同任务的不同权限。
我最初的想法是创建一个MySQL数据库,将凭证硬编码到应用程序中,并让应用程序连接到MySQL数据库。然后MySQL数据库将有一个名为“users”的表,它将存储用户名,密码和权限。然后,应用程序将查询服务器并执行身份验证。
最大的问题是将MySQL凭据硬编码到应用程序中。如果应用程序落入坏人之手,如果他们窥探查找凭据并开始删除表,他们可能会对MySQL数据库造成很大的破坏。
所以我想开发一个充当MySQL数据库接口的服务器。例如,客户端应用程序将通过TCP连接到服务器,服务器连接到MySQL数据库。这样,MySQL凭证永远不会暴露给最终用户。但是,这意味着我必须开发一个服务器应用程序,a)将更难为我的客户维护和部署(而不是仅仅设置MySQL服务器)和b)因为我有一个额外的系统,有可能引入更多错误我需要制作(这与关于部署错误修复的关联点等)
所以我在思考而不是在数据库中有一个用户表,并让应用程序使用硬编码凭证直接连接到MySQL服务器,最终用户将获得实际的MySQL用户凭据,他们将在其中输入应用程序连接到MySQL服务器。这意味着如果有人接触到应用程序,他们就不会对MySQL数据库造成任何损害,但仍然存在最终用户将凭据提供给错误的人的风险。
将桌面应用程序连接到MySQL数据库的最佳方法是什么?除了我想到的3之外还有其他解决方案吗,或者您对我的解决方案有什么想法?
答案 0 :(得分:3)
正如@Perception所说。这里最好的选择是在MySQL面前实现一个Web服务。您不希望未知IP地址的未知数量的客户端都可以访问您的数据库。
通过捆绑MySQL连接,DOS攻击你真的很容易。更不用说你会非常严格地限制你扩展后端服务的能力,以满足增加客户群的需求,而不需要在它们之间提供Web服务。
Web服务还可以让您以多种方式控制用户身份验证和授权(用户/密码组合,基于令牌的访问,OAuth访问等)。
答案 1 :(得分:2)
我工作的地方有两种我见过的做法:
每个实体(人员,事物或业务(取决于所需的粒度级别)访问数据库)都有自己的凭据。这用于MSSQL和Rocket Universe数据库。这主要是零售和遗留软件。
我们自己托管应用程序,并为用户使用单独的身份验证系统。数据库凭据存储在托管应用程序的服务器上。客户端对后备数据库一无所知。这些通常是网络应用和网络服务。
我们所做的一件事就是我们的许多应用程序实际上是通过一种以某种方式模拟数据库的RESTful服务进行通信。应用程序本身无权访问数据库。我会阅读关于restful服务的维基百科文章以获取更多信息。我们的身份验证是使用Nonce编码的HMAC请求完成的,其中每个用户都有自己的密钥与他们的凭据相关联。
将数据库包装在Web服务中可以带来一些可能的优势:
我看到的缺点:
RESTful架构:http://en.wikipedia.org/wiki/Representational_state_transfer
HMAC:http://en.wikipedia.org/wiki/Hash-based_message_authentication_code
我们的HMAC系统的工作原理如下:
如果不使用HTTPS,上述内容很容易受到中间人攻击,因此人们常常根据nonce和请求的URL以及时间戳发出消息,并在其上计算HMAC。然后,服务器根据URL重新创建消息,检查时间戳是否在某个范围内(+/- 4分钟或其他),然后根据该信息授权用户。
为了进一步细化操作,我们还有一个角色系统,它检查拥有Session / API Key的用户是否已获得请求他们请求的东西的权限。如果他们具有适当的角色,则授予该请求。
摘要:凭据是逐个用户完成的,最终用户不了解数据库,Web服务将数据库包装在RESTful API中,基于角色的系统用于细化权限。
这只是一个建议,我不说这是最好或唯一的方法。这恰好就是我们在工作的地方最终做到的。
答案 2 :(得分:0)
让我们看两种处理数据库的方法:
考虑您的使用案例:
有效的有效序列号或存储/读取有关特定用户的信息
可以通过以下方式设计它以提供安全性。 (我不是这方面的专家)
我认为让客户端直接访问您的数据库是个好主意。因此,如果可能,第二种选择更好。
另请注意,基于密码的身份验证并不理想。