首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyMySQL如何防止用户受到sql注入攻击?

问PyMySQL如何防止用户受到sql注入攻击?
EN

Stack Overflow用户
提问于 2018-08-02 06:55:57
回答 1查看 5.2K关注 0票数 4

很抱歉在这里问您,但是我找不到关于pymysql安全指南中关于如何防止sql注入的大量参考,当我进行PHP开发时,我知道使用mysql preared语句(或称为参数化查询或stmt),但我在pymysql中找不到这方面的参考。

简单的代码使用pymysql,如

代码语言:javascript
复制
sqls="select id from tables where name=%s"
attack="jason' and 1=1"
cursor.execute(sqls,attack)

我如何知道这是否会防止sql注入攻击?如果阻止成功,pymysql如何防止? cursor.execute默认情况下已经使用了预置语句吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-02 15:53:30

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

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

但是Python驱动程序在插入参数时确实正确地转义了该参数,这可以防止SQL注入。

我可以在打开查询日志时证明这一点:

代码语言:javascript
复制
mysql> SET GLOBAL general_log=ON;

并在运行Python脚本时跟踪日志:

代码语言:javascript
复制
$ 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注入漏洞示例:

代码语言:javascript
复制
attack="jason' and '1'='1"
sqls="select id from tables where name='%s'" % attack
cursor.execute(sqls)

日志显示,这导致了SQL注入:

代码语言:javascript
复制
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  
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51647301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档