Python лучшая практика и безопасный для подключения к MySQL и выполнения запросов - PullRequest
53 голосов
/ 28 октября 2011

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

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

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

Ответы [ 3 ]

77 голосов
/ 28 октября 2011

Чтобы избежать инъекций, используйте 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'), если параметр является строкой.

70 голосов
/ 28 октября 2011

В качестве расширения ответа Бруно ваша клиентская библиотека 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})
* 1013 'формат' * * * 1014
>>> 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'

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

0 голосов
/ 03 июля 2018

Если вы используете mysqldb, вы можете использовать встроенную функцию escape_string. Вот так.

sql = "SELECT spam FROM eggs WHERE lumberjack = '" + MySQLdb.escape_string(str(lumberjack)) + "';"
cursor.execute(sql)

Я всегда предпочитаю использовать функцию escape коннектора базы данных - он работает как задумано, и ручное кодирование функций escape самостоятельно представляет угрозу безопасности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...