很抱歉在这里问您,但是我找不到关于pymysql安全指南中关于如何防止sql注入的大量参考,当我进行PHP开发时,我知道使用mysql preared语句(或称为参数化查询或stmt),但我在pymysql中找不到这方面的参考。
简单的代码使用pymysql,如
sqls="select id from tables where name=%s"
attack="jason' and 1=1"
cursor.execute(sqls,attack)我如何知道这是否会防止sql注入攻击?如果阻止成功,pymysql如何防止? cursor.execute默认情况下已经使用了预置语句吗?
发布于 2018-08-02 15:53:30
Python驱动程序不使用真正的查询参数。在python中,参数(示例中的变量attack )是在将SQL发送到数据库服务器之前插入到SQL字符串中的。
这与使用查询参数不同。在真正的参数化查询中,SQL字符串被发送到数据库服务器,参数占位符完好无损。
但是Python驱动程序在插入参数时确实正确地转义了该参数,这可以防止SQL注入。
我可以在打开查询日志时证明这一点:
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注入向量。
实际上,我正在测试MySQL的Connector/Python,但是pymysql也做了同样的事情。
我不同意Python连接器避免使用真实查询参数的设计决策(即,通过将SQL查询发送到带有参数占位符的数据库,并分别发送这些参数的值)。这样做的风险是,程序员会认为将参数插入到查询字符串中的任何字符串都会与让驱动程序执行时一样工作。
SQL注入漏洞示例:
attack="jason' and '1'='1"
sqls="select id from tables where name='%s'" % attack
cursor.execute(sqls)日志显示,这导致了SQL注入:
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 https://stackoverflow.com/questions/51647301
复制相似问题