首页 > 解决方案 > 如何正确参数化查询和转义输入以防止 SQL 注入?

问题描述

我在 Python 3.4.3 中使用 mysqlclient(python3 的 MySQLdb1 的分支),根据我在网上阅读的内容(Escape string Python for MySQL),MySQLdb Python 查询应该这样编写以进行正确的转义:

query = self.conn.cursor()
query.execute('SELECT 1 FROM servers WHERE ip=%s AND port=%s AND game_id=%s' ,(ip,port,gameid))

不幸的是,当我这样做时,我收到以下错误:

% 不支持的操作数类型:“字节”和“元组”mysqldb

这似乎可行,但这可能导致 SQL 注入?

query = self.conn.cursor()
query.execute("SELECT 1 FROM servers WHERE ip='%s' AND port=%s AND game_id='%s'" % (ip,port,gameid))

那么,如何使用在 Python 3.4.3 中为我转义的首选语法方法安全地使上述查询正常工作?

标签: pythonmysql-python

解决方案


我无法让 mysqlclient(MySQLdb 的一个分支)https://pypi.org/project/mysqlclient/使用正确的 SQL 语法(为您转义所有内容的语法)与 Python 3.4 一起工作。我切换到 mysql-connector,现在相同的查询代码可以正常工作。它看起来像 mysqlclient 中的一个错误。

pip3 install mysql-connector-python

https://pypi.org/project/mysql-connector-python/


推荐阅读