gpt4 book ai didi

python - PyMySQL 如何防止用户遭受 sql 注入(inject)攻击?

转载 作者:行者123 更新时间:2023-12-04 12:01:01 25 4
gpt4 key购买 nike

很抱歉在这里提问,但我找不到很多关于 pymysql 的安全指南关于我们如何防止 sql 注入(inject)的引用,
当我做 PHP 开发时,我知道使用 mysql 准备语句(或称为参数化查询或 stmt),但我在 pymysql 中找不到关于此的引用

简单的代码使用pymysql之类的

sqls="select id from tables where name=%s"
attack="jason' and 1=1"
cursor.execute(sqls,attack)

我怎么知道这是否会阻止sql注入(inject)攻击?如果阻止成功,pymysql如何阻止?cursor.execute是否已经默认使用preparedstatement?

最佳答案

Python 驱动程序不使用真正的查询参数。在python中,在将SQL发送到数据库服务器之前,参数(在你的例子中是变量attack)被插入到SQL字符串中。

这与使用查询参数不同。在真正的参数化查询中,SQL 字符串被发送到数据库服务器,参数占位符完好无损。

但是 Python 驱动程序在插入时确实会正确地转义参数,从而防止 SQL 注入(inject)。

我打开查询日志就可以证明:

mysql> SET GLOBAL general_log=ON;

并在我运行 Python 脚本时跟踪日志:
$ tail -f /usr/local/var/mysql/bkarwin.log
...
180802 8:50:47 14 Connect root@localhost on test
14 Query SET @@session.autocommit = OFF
14 Query select id from tables where name='jason\' and 1=1'
14 Quit

您可以看到查询已将值插入其中,并且嵌入的引号字符前面有一个反斜杠,这可以防止它成为 SQL 注入(inject)向量。

我实际上是在测试 MySQL 的连接器/Python,但 pymysql 做同样的事情。

我不同意 Python 连接器的这一设计决策,以避免使用真实的查询参数(即真实的参数通过将 SQL 查询发送到带有参数占位符的数据库,并分别发送这些参数的值来工作)。风险在于程序员会认为将参数插入查询字符串的任何字符串都将与您让驱动程序执行时一样工作。

SQL注入(inject)漏洞示例:
attack="jason' and '1'='1"
sqls="select id from tables where name='%s'" % attack
cursor.execute(sqls)

日志显示这导致了 SQL 注入(inject):
180802  8:59:30    16 Connect   root@localhost on test
16 Query SET @@session.autocommit = OFF
16 Query select id from tables where name='jason' and '1'='1'
16 Quit

关于python - PyMySQL 如何防止用户遭受 sql 注入(inject)攻击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51647301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com