0

Экранирование символов в Python и SQLite

13

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

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

Столкнулся с проблемой:

Когда я пытаюсь выполнить следующий запрос:

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

Я получаю ошибку:

OperationalError: near "Allo": syntax error

Однако, если я убираю экранирование для некоторых кавычек, код работает:

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

Почему так происходит? Я не могу избавиться от начальных кавычек, так как они являются частью названия фильма.

Спасибо за помощь!

3 ответ(ов)

1

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

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

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

0

Обратите внимание, что re.escape делает строку безопасной для регулярных выражений, а не для базы данных. Как говорит @Donal, вам необходимо использовать концепцию подстановки параметров из Python DB API – именно это делает ваши данные безопасными для базы данных.

0

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

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь