Уведомления

Группа в Telegram: @pythonsu

#1 Март 5, 2014 13:19:10

allXunder
Зарегистрирован: 2014-03-05
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Экранирование смешанных кавычек для вставки в базу (mySQL)

Добрый день всем! Заранее извиняюсь если было, но поиском ничего не нашел.
При составлении книжного каталога возникла такая проблема:
Есть произведение (на самом деле не одно, но возьмем это для примера) с названием:
“Четыре ночи мечтателя” (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) (реальный запрос сложнее, тут просто сократил для ясности).

Заранее спасибо!

Офлайн

#2 Март 5, 2014 14:50:50

alexsis
Зарегистрирован: 2013-07-26
Сообщения: 148
Репутация: +  9  -
Профиль   Отправить e-mail  

Экранирование смешанных кавычек для вставки в базу (mySQL)

В python апостроф и двойная кавычка экранируется так:

'\''
'\"'
вот, например все меняется на пробелы:
>>> string = '“Четыре ночи мечтателя” (Quatre nuits d\'un rêveur, 1971) Робера Брессона '
>>> string = string.replace('\'', ' ')
>>> string = string.replace('\"', ' ')
Точно не знаю, но в mysql кажется так тоже можно

Отредактировано alexsis (Март 5, 2014 14:58:47)

Офлайн

#3 Март 5, 2014 15:16:00

allXunder
Зарегистрирован: 2014-03-05
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Экранирование смешанных кавычек для вставки в базу (mySQL)

alexsis
В python апостроф и двойная кавычка экранируется так:
Мне как раз нужно сохранить оригинальный текст названия. И задача состоит в том, чтобы экранировать символы в строке, чтобы ее можно было безопасно передать в SQL-запросе

Офлайн

#4 Март 5, 2014 15:21:56

alexsis
Зарегистрирован: 2013-07-26
Сообщения: 148
Репутация: +  9  -
Профиль   Отправить e-mail  

Экранирование смешанных кавычек для вставки в базу (mySQL)

Офлайн

#5 Март 5, 2014 20:00:47

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

Экранирование смешанных кавычек для вставки в базу (mySQL)

Используйте любой 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)

Офлайн

#6 Март 6, 2014 03:47:46

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9897
Репутация: +  855  -
Профиль   Отправить e-mail  

Экранирование смешанных кавычек для вставки в базу (mySQL)

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)

Офлайн

#7 Март 6, 2014 08:39:27

allXunder
Зарегистрирован: 2014-03-05
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Экранирование смешанных кавычек для вставки в базу (mySQL)

Всем спасибо за рекомендации и советы - буду разбираться.
Проблему в итоге решил следующей конструкцией:

b_name = re.sub('(\")','\\"' ,b_name)
b_name = re.sub('(\')',"\\'",b_name)
b_name = "'" + b_name + "'"

Отредактировано allXunder (Март 6, 2014 15:06:09)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version