如何正确地参数化查询和转义输入以防止SQL注入?

问题描述 投票:0回答:2

我在Python 3.4.3中使用mysqlclient(MySQLdb1 for python3的fork),根据我在线阅读的内容(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))

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

%不支持的操作数类型:'bytes'和'tuple'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中为我解决所有问题?

python mysql-python
2个回答
0
投票

我无法使用mysqlclient(MySQLdb的一个分支)https://pypi.org/project/mysqlclient/与Python 3.4一起使用正确的SQL语法(为你逃避一切的语法)。我切换到mysql-connector,相同的查询代码现在工作正常。它看起来像是mysqlclient中的一个bug。

pip3 install mysql-connector-python

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


0
投票

mysqlclient-python不再支持Python 3.4。使用更新的Python。

© www.soinside.com 2019 - 2024. All rights reserved.