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

时间:2019-03-22 17:49:27

标签: python mysql-python

我在Python 3.4.3中使用mysqlclient(用于python3的MySQLdb1的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))

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

  

%不支持的操作数类型:“字节”和“元组” 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中对我全部进行转义?

2 个答案:

答案 0 :(得分:0)

我无法使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/

答案 1 :(得分:0)

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