Форум сайта python.su
Добрый день всем! Заранее извиняюсь если было, но поиском ничего не нашел.
При составлении книжного каталога возникла такая проблема:
Есть произведение (на самом деле не одно, но возьмем это для примера) с названием:
“Четыре ночи мечтателя” (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) (реальный запрос сложнее, тут просто сократил для ясности).
Заранее спасибо!
Офлайн
В python апостроф и двойная кавычка экранируется так:
'\'' '\"'
>>> string = '“Четыре ночи мечтателя” (Quatre nuits d\'un rêveur, 1971) Робера Брессона ' >>> string = string.replace('\'', ' ') >>> string = string.replace('\"', ' ')
Отредактировано alexsis (Март 5, 2014 14:58:47)
Офлайн
alexsisМне как раз нужно сохранить оригинальный текст названия. И задача состоит в том, чтобы экранировать символы в строке, чтобы ее можно было безопасно передать в SQL-запросе
В python апостроф и двойная кавычка экранируется так:
Офлайн
Офлайн
Используйте любой ORM. Помимо кавычек есть еще тысяча способов сделать SQL-иньекцию.
Например этот http://www.sqlalchemy.org
Если не хотите связываться с ORM
''.join([x for x in your_string if x.isalnum() or x.isspace() ])
Отредактировано Alen (Март 5, 2014 20:01:38)
Офлайн
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\'.'); >>>
Отредактировано py.user.next (Март 6, 2014 03:54:43)
Офлайн
Всем спасибо за рекомендации и советы - буду разбираться.
Проблему в итоге решил следующей конструкцией:
b_name = re.sub('(\")','\\"' ,b_name) b_name = re.sub('(\')',"\\'",b_name) b_name = "'" + b_name + "'"
Отредактировано allXunder (Март 6, 2014 15:06:09)
Офлайн