Найти - Пользователи
Полная версия: Экранирование смешанных кавычек для вставки в базу (mySQL)
Начало » Python для новичков » Экранирование смешанных кавычек для вставки в базу (mySQL)
1
allXunder
Добрый день всем! Заранее извиняюсь если было, но поиском ничего не нашел.
При составлении книжного каталога возникла такая проблема:
Есть произведение (на самом деле не одно, но возьмем это для примера) с названием:
“Четыре ночи мечтателя” (Quatre nuits d'un rêveur, 1971) Робера Брессона
Как видно в строке есть и одинарные и двойные кавычки.
Пробовал несколько способов для экранирования:
1. При помощи xss.quoteattr() (парные кавычки она вроде обрабатывает, а вот одинарные нет)
2. При помощи замены string.replace(b_name,“'”,“”“\'”“”) - здесь вообще срока никак не меняется
3. Сочетанием этих способов. и оборачиванием строки в разные кавычки, в зависимости от того какие кавычки есть в самой строке.

Google готовых ответов не дал

Как правильно поступать в таком случае, что бы можно было такую строку передать в параметре в строку SQL-запроса?
u'''INSERT INTO books (b_name) VALUES ({name}) "'''.format(name=b_name) (реальный запрос сложнее, тут просто сократил для ясности).

Заранее спасибо!
alexsis
В python апостроф и двойная кавычка экранируется так:
'\''
'\"'
вот, например все меняется на пробелы:
>>> string = '“Четыре ночи мечтателя” (Quatre nuits d\'un rêveur, 1971) Робера Брессона '
>>> string = string.replace('\'', ' ')
>>> string = string.replace('\"', ' ')
Точно не знаю, но в mysql кажется так тоже можно
allXunder
alexsis
В python апостроф и двойная кавычка экранируется так:
Мне как раз нужно сохранить оригинальный текст названия. И задача состоит в том, чтобы экранировать символы в строке, чтобы ее можно было безопасно передать в SQL-запросе
alexsis
Это?
Alen
Используйте любой ORM. Помимо кавычек есть еще тысяча способов сделать SQL-иньекцию.
Например этот http://www.sqlalchemy.org

Если не хотите связываться с ORM
''.join([x for x in your_string if x.isalnum() or x.isspace() ])

py.user.next
allXunder
Как видно в строке есть и одинарные и двойные кавычки.
оборачивай в теги кода данные, чтобы форум не заменял в них символы

какие двойные кавычки там ?
>>> import unicodedata
>>> unicodedata.name('“')
'LEFT DOUBLE QUOTATION MARK'
>>> unicodedata.name('"')
'QUOTATION MARK'
>>>

allXunder
здесь вообще срока никак не меняется
аналогично
что ты там писал и что в итоге выдал форум - непонятно

нужно проэкранировать бэкслеш
>>> '\\\''
"\\'"
>>> print(_)
\'
>>>

mysql> SELECT * FROM t;
+--------+--------------------+
| number | message |
+--------+--------------------+
| 1 | The first message. |
+--------+--------------------+
1 row in set (0.00 sec)

mysql> INSERT INTO t VALUES (2, 'Test \'single quotes\'.');
Query OK, 1 row affected (0.03 sec)

mysql> SELECT * FROM t;
+--------+-----------------------+
| number | message |
+--------+-----------------------+
| 1 | The first message. |
| 2 | Test 'single quotes'. |
+--------+-----------------------+
2 rows in set (0.01 sec)

mysql>

>>> s = 'INSERT INTO t VALUES (2, \'Test \\\'single quotes\\\'.\');'
>>> print(s)
INSERT INTO t VALUES (2, 'Test \'single quotes\'.');
>>>
allXunder
Всем спасибо за рекомендации и советы - буду разбираться.
Проблему в итоге решил следующей конструкцией:
b_name = re.sub('(\")','\\"' ,b_name)
b_name = re.sub('(\')',"\\'",b_name)
b_name = "'" + b_name + "'"
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB