在Python客户机程序中保护MySQL登录数据

2024-04-19 18:47:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Python客户机程序(对有限数量的用户可用),它使用pymysql模块从远程MySQL数据库获取数据。在

问题是数据库的登录数据对查看代码的每个人都是可见的,因此每个人都可以操作或删除数据库中的数据。即使我将登录数据存储在加密文件中,有些人仍然可以编辑代码并插入自己的MySql查询(并再次操作或删除数据)。在

那么,如何从我的程序访问数据库,仍然选择、删除或更新其中的数据,但要确保没有人可以执行自己的(邪恶的)SQL代码(除了使用GUI触发的那些代码)?在


Tags: 模块文件数据代码用户程序数据库编辑
2条回答

这恰好是桌面客户机-服务器体系结构让位给web体系结构的原因之一。一旦桌面用户访问了dbms,他们就不必在应用程序中只使用SQL。他们可以随心所欲。在

在那些糟糕的过去,客户机-服务器应用程序只能通过存储过程更改DBMS中的行。它们没有INSERTUPDATEDELETE行的直接特权。这些应用程序的用户拥有一组有限的特权,他们可以GRANT行并运行过程,就这样。他们当然没有任何create/drop/table特权。在

(这就是为什么一个典型的DBMS具有如此精细的权限控制。)

您应该限制桌面应用程序用户使用的一个或多个帐户的权限。(当然,web应用访问帐户也是如此)理想情况下,每个用户都应该有自己的帐户。它应该只允许访问应用程序需要的特定数据库。在

然后,如果不信任用户避免破坏数据,可以编写、测试和部署存储过程来执行应用程序所需的每次插入、更新或删除操作。在

这是一个众所周知的缓慢和官僚的方式来完成它;你可能想要做一个好的备份和信任你的用户,或者切换到一个web应用程序。在

如果你确实相当信任他们,那么就把他们限制在你的应用程序所使用的特定数据库中。在

您可以通过参数化参数来防止注入,例如:

"SELECT * FROM Users WHERE name=\"".name."\";"

将阅读

^{pr2}$

但被“注射”的是:

name="\" or UserType=\"Admin"

然后它会读到

SELECT * FROM Users WHERE name="" or UserType="Admin";

这很糟糕,你可以用以下方法来防止这种情况:

SELECT * FROM Users WHERE name=?

然后绑定变量,SQL server实际上不解析来自用户的任何数据,它会看到?,而只是从参数中读取数据。在

您不能自己隐藏SQL语句

当然,您可以隐藏它们,但它们会出现在.pyo或.py代码中的某个地方!在

您有两种选择:

MySQL支持用户——这就是用户的目的,并假设“只有相当值得信赖的人才能得到我的程序”,这样你就可以拥有一个像Debbie_From_Accounts" who can select from theuserstable, and update/delete/insert/select fromFinancial` Tables这样的用户。在

或者!在

您可以在服务器上使用某种API,并拥有一组PHP脚本来完成DB工作,而您只需http获取页面。在

相关问题 更多 >