Подтвердить что ты не робот

Лучшая практика Python и самая безопасная для подключения к MySQL и выполнения запросов

Какой безопасный способ запускать запросы в mysql, я знаю об опасностях, связанных с MySQL и SQL-инъекцией.

Однако я не знаю, как я должен запускать свои запросы, чтобы предотвратить впрыскивание переменных, к которым могут манипулировать другие пользователи (веб-клиенты). Я использовал свою собственную функцию эвакуации, но, видимо, это "не сделано".

Что я должен использовать и как его использовать для запроса и безопасного добавления в базу данных MySQL через python, не рискуя инъекцией mysql?

4b9b3361

Ответ 1

Чтобы избежать инъекций, используйте execute с %s вместо каждой переменной, затем передайте значение через список или кортеж в качестве второго параметра execute. Вот пример из документации:

c=db.cursor()
max_price=5
c.execute("""SELECT spam, eggs, sausage FROM breakfast
          WHERE price < %s""", (max_price,))

Обратите внимание, что это используется запятая, а не % (которая будет прямой подстановкой строки, а не экранирована). Не делайте этого:

c.execute("""SELECT spam, eggs, sausage FROM breakfast
          WHERE price < %s""" % (max_price,))

Кроме того, вам не нужны кавычки вокруг держателя позиции ('%s'), если параметр является строкой.

Ответ 2

В качестве расширения ответа Бруно ваша клиентская библиотека MySQL может поддерживать любой из нескольких разных форматов для указания именованных параметров. Из PEP 249 (DB-API) вы можете написать свои запросы, например:

'qmark'

>>> cursor.execute("SELECT spam FROM eggs WHERE lumberjack = ?", (lumberjack,))

'Числовой'

>>> cursor.execute("SELECT spam FROM eggs WHERE lumberjack = :1", (lumberjack,))

'под названием'

>>> cursor.execute("SELECT spam FROM eggs WHERE lumberjack = :jack", {'jack': lumberjack})

'формат'

>>> cursor.execute("SELECT spam FROM eggs WHERE lumberjack = %s", (lumberjack,))

'pyformat'

>>> cursor.execute("SELECT spam FROM eggs WHERE lumberjack = %(jack)s", {'jack': lumberjack})

Вы можете увидеть, какую поддержку поддерживает ваша клиентская библиотека, просмотрев переменную уровня модуля paramstyle:

>>> clientlibrary.paramstyle
'pyformat'

Любой из вышеперечисленных вариантов должен делать правильную вещь, касающуюся обработки ваших небезопасных данных. Как отметил Бруно, пожалуйста, никогда не пытайтесь вставлять параметры самостоятельно. Обычно используемые клиентские библиотеки намного лучше обрабатывают данные, чем мы, простые смертные.