Python эквивалент mysql_real_escape_string, для безопасного ввода строк в MySQL? - PullRequest
17 голосов
/ 01 апреля 2010

Есть ли Python-эквивалент PHP mysql_real_escape_string?

Я пытаюсь вставить некоторые строки в базу данных MySQL напрямую из Python, и меня продолжают путать в кавычках в строках.

mysql_string = "INSERT INTO candidate (name, address) VALUES  " 
for k, v in v_dict.iteritems():
    mysql_string += " ('" + v_dict['name'] + "', '" + v_dict['address'] + "'), "
mysql_string += ";"
cursor.execute(mysql_string)

Я пробовал re.escape(), но это экранирует все не алфавитно-цифровые символы в строках, а это не то, что мне нужно - мне просто нужно экранировать одинарные кавычки в этом случае (плюс, в более общем случае, все остальное, что может сработать MySQL).

Полагаю, это можно сделать вручную, но есть ли более разумный способ сделать это в Python?

Ответы [ 6 ]

38 голосов
/ 01 апреля 2010

Если вы используете mysql-python, просто попробуйте

MySQLdb.escape_string(SQL)

Пример

>>> import MySQLdb
>>> MySQLdb.escape_string("'")
"\\'"
14 голосов
/ 01 апреля 2010
cursor.executemany('INSERT INTO candidate (name, address) VALUES (%s, %s)',
                   [(v_dict['name'], v_dict['address'])] * len(v_dict))

должен делать то, что пытается сделать ваш код - вставлять одинаковые идентичные значения N раз (вы зацикливаетесь на v_dict.iteritems(), но полностью игнорируете переменные цикла, и просто используете эти конкретные два значения) от v_dict каждый раз). Конечно, если вы имеете в виду что-то совершенно иное, вторую строку необходимо будет соответствующим образом изменить, но в любом случае ключевая идея заключается в использовании для таких задач заполнителей, а не форматирования строк.

8 голосов
/ 01 апреля 2010

Есть ли в Python эквивалент PHP-mysql_real_escape_string?

Да, это escape_string в базе данных соединение объект.

Не escape_string в модуле MySQLdb, что эквивалентно mysql_escape_string в PHP и имеет такую ​​же потенциальную уязвимость с многобайтовыми наборами символов. Вы не должны использовать MySQLdb.escape_string.

В любом случае вам гораздо лучше использовать параметризованные запросы, как в ответе Алекса. Это облегчает портирование на другие базы данных (это часть стандарта DB-API, которого нет escape_string), и, как правило, это более удобно. (И гораздо удобнее, чем параметризация в PHP.)

3 голосов
/ 01 апреля 2010

В данном конкретном случае вам просто нужно использовать метод executemany курсора.

mysql_string = "INSERT INTO candidate (name, address) VALUES  (%s,%s);"
cursor.executemany(mysql_string, v_dict.iteritems())
2 голосов
/ 01 апреля 2010

MySQLdb.escape_string эквивалентно. Все это описано в документации .

1 голос
/ 27 сентября 2017

рядом с MySQLdb.escape_string(SQL), библиотека Python Pymysql также предоставляет функцию escape_string().

>>> import pymysql
>>> pymysql.escape_string("'")
"\\'"
>>>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...