2024-04-19 18:47:49 发布
网友
我有一个Python客户机程序(对有限数量的用户可用),它使用pymysql模块从远程MySQL数据库获取数据。在
问题是数据库的登录数据对查看代码的每个人都是可见的,因此每个人都可以操作或删除数据库中的数据。即使我将登录数据存储在加密文件中,有些人仍然可以编辑代码并插入自己的MySql查询(并再次操作或删除数据)。在
那么,如何从我的程序访问数据库,仍然选择、删除或更新其中的数据,但要确保没有人可以执行自己的(邪恶的)SQL代码(除了使用GUI触发的那些代码)?在
这恰好是桌面客户机-服务器体系结构让位给web体系结构的原因之一。一旦桌面用户访问了dbms,他们就不必在应用程序中只使用SQL。他们可以随心所欲。在
在那些糟糕的过去,客户机-服务器应用程序只能通过存储过程更改DBMS中的行。它们没有INSERT、UPDATE或DELETE行的直接特权。这些应用程序的用户拥有一组有限的特权,他们可以GRANT行并运行过程,就这样。他们当然没有任何create/drop/table特权。在
INSERT
UPDATE
DELETE
GRANT
(这就是为什么一个典型的DBMS具有如此精细的权限控制。)
您应该限制桌面应用程序用户使用的一个或多个帐户的权限。(当然,web应用访问帐户也是如此)理想情况下,每个用户都应该有自己的帐户。它应该只允许访问应用程序需要的特定数据库。在
然后,如果不信任用户避免破坏数据,可以编写、测试和部署存储过程来执行应用程序所需的每次插入、更新或删除操作。在
这是一个众所周知的缓慢和官僚的方式来完成它;你可能想要做一个好的备份和信任你的用户,或者切换到一个web应用程序。在
如果你确实相当信任他们,那么就把他们限制在你的应用程序所使用的特定数据库中。在
您可以通过参数化参数来防止注入,例如:
"SELECT * FROM Users WHERE name=\"".name."\";"
将阅读
但被“注射”的是:
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这样的用户。在
Debbie_From_Accounts" who can select from the
table, and update/delete/insert/select from
或者!在
您可以在服务器上使用某种API,并拥有一组PHP脚本来完成DB工作,而您只需http获取页面。在
这恰好是桌面客户机-服务器体系结构让位给web体系结构的原因之一。一旦桌面用户访问了dbms,他们就不必在应用程序中只使用SQL。他们可以随心所欲。在
在那些糟糕的过去,客户机-服务器应用程序只能通过存储过程更改DBMS中的行。它们没有
INSERT
、UPDATE
或DELETE
行的直接特权。这些应用程序的用户拥有一组有限的特权,他们可以GRANT
行并运行过程,就这样。他们当然没有任何create/drop/table特权。在(这就是为什么一个典型的DBMS具有如此精细的权限控制。)
您应该限制桌面应用程序用户使用的一个或多个帐户的权限。(当然,web应用访问帐户也是如此)理想情况下,每个用户都应该有自己的帐户。它应该只允许访问应用程序需要的特定数据库。在
然后,如果不信任用户避免破坏数据,可以编写、测试和部署存储过程来执行应用程序所需的每次插入、更新或删除操作。在
这是一个众所周知的缓慢和官僚的方式来完成它;你可能想要做一个好的备份和信任你的用户,或者切换到一个web应用程序。在
如果你确实相当信任他们,那么就把他们限制在你的应用程序所使用的特定数据库中。在
您可以通过参数化参数来防止注入,例如:
将阅读
^{pr2}$但被“注射”的是:
然后它会读到
这很糟糕,你可以用以下方法来防止这种情况:
然后绑定变量,SQL server实际上不解析来自用户的任何数据,它会看到
?
,而只是从参数中读取数据。在您不能自己隐藏SQL语句
当然,您可以隐藏它们,但它们会出现在.pyo或.py代码中的某个地方!在
您有两种选择:
MySQL支持用户——这就是用户的目的,并假设“只有相当值得信赖的人才能得到我的程序”,这样你就可以拥有一个像
Debbie_From_Accounts" who can select from the
userstable, and update/delete/insert/select from
Financial` Tables这样的用户。在或者!在
您可以在服务器上使用某种API,并拥有一组PHP脚本来完成DB工作,而您只需http获取页面。在
相关问题 更多 >
编程相关推荐