Как правильно параметризовать запрос и экранировать входные данные правильно, чтобы предотвратить внедрение SQL? - PullRequest
0 голосов
/ 22 марта 2019

Я использую mysqlclient (форк MySQLdb1 для python3) в Python 3.4.3, и согласно тому, что я прочитал онлайн ( Escape-строка Python для 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?

Ответы [ 2 ]

0 голосов
/ 23 марта 2019

mysqlclient-python больше не поддерживает Python 3.4.Используйте более новый Python.

0 голосов
/ 23 марта 2019

Мне не удалось заставить mysqlclient (разветвление MySQLdb) https://pypi.org/project/mysqlclient/ работать с Python 3.4 с правильным синтаксисом SQL (синтаксис, который для вас исключает все).Я переключился на mysql-разъем, и тот же код запроса теперь работает нормально.Похоже, ошибка в mysqlclient.

pip3 install mysql-connector-python

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

...