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

How to properly parameterize query and escape inputs properly to prevent SQL injection?

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

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

unsupported operand type(s) for %: 'bytes' and '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 中,如何使用首选语法方法安全地使上面的查询正常工作?

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

pip3 install mysql-connector-python

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

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