Экранирование символов в Python и sqlite - PullRequest
41 голосов
/ 10 июля 2010

У меня есть скрипт на python, который считывает необработанные текстовые файлы фильмов в базу данных sqlite.

Я использую re.escape (title) для добавления escape-символов в строки, чтобы сделать их безопасными в БД перед выполнением вставок.

Почему это не работает:

In [16]: c.execute("UPDATE movies SET rating = '8.7' WHERE name='\'Allo\ \'Allo\!\"\ \(1982\)'")
--------------------------------------------------------------------------- OperationalError                       Traceback (most recent call last)

/home/rajat/Dropbox/amdb/<ipython console> in <module>()

OperationalError: near "Allo": syntax error

Все же это работает (удалено в двух местах):

In [17]: c.execute("UPDATE movies SET rating = '8.7' WHERE name='Allo\ Allo\!\"\ \(1982\)'") Out[17]: <sqlite3.Cursor object at 0x9666e90>

Я не могу понять это. Я также не могу отказаться от этих ведущих цитат, потому что они на самом деле являются частью названия фильма. Спасибо.

Ответы [ 4 ]

97 голосов
/ 10 июля 2010

Вы делаете это неправильно.В прямом смысле.Вы должны использовать параметры, например:

c.execute("UPDATE movies SET rating = ? WHERE name = ?", (8.7, "'Allo 'Allo! (1982)"))

Таким образом, вам вообще не нужно будет делать любое цитирование и (если эти значения получены от кого-либо, кому не доверяют), выВы также будете на 100% защищены (здесь) от атак с использованием SQL-инъекций.

10 голосов
/ 10 июля 2010

Я использую re.escape (title), чтобы добавить escape символы в строки, чтобы сделать их дБ сейф

Обратите внимание, что re.escape делает строку re -безопасной - не имеет ничего общего с безопасностью db . Скорее, как говорит @Donal, вам нужна концепция подстановки параметров *1011* API-интерфейса DB Python - , которая делает вещи "безопасными на уровне базы данных" по мере необходимости.

7 голосов
/ 13 июля 2010

SQLite не поддерживает escape-последовательности с обратной косой чертой. Апострофы в строковых литералах обозначаются удвоением их: '''Allo ''Allo! (1982)'.

Но, как сказал Донал, вы должны использовать параметры.

0 голосов
/ 10 августа 2016

У меня есть один простой совет, который вы можете использовать для решения этой проблемы: Если строка оператора SQL имеет одинарную кавычку: ', тогда вы можете использовать двойную кавычку, чтобы заключить строку оператора. И когда строка вашего оператора SQL имеет двойные кавычки: ", тогда вы можете использовать одинарные кавычки:", чтобы заключить строку вашего оператора. Э.Г.

sqlString="UPDATE movies SET rating = '8.7' WHERE name='Allo Allo !' (1982 )"
c.execute(sqlString)

Или,

sqlString='UPDATE movies SET rating = "8.7" WHERE name="Allo Allo !" (1982 )'
c.execute(sqlString)

Это решение работает для меня в среде Python.

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