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

python sqlite

30674 просмотра

4 ответа

У меня есть сценарий 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>

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

Автор: rajat banerjee Источник Размещён: 12.11.2019 09:24

Ответы (4)


103 плюса

Решение

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

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

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

Автор: Donal Fellows Размещён: 10.07.2010 04:48

11 плюса

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

Обратите внимание, что это re.escapeделает строку повторно безопасной - не имеет ничего общего с безопасностью БД . Скорее, как говорит @Donal, вам нужна концепция подстановки параметров Python DB API - которая делает вещи «безопасными», как вам нужно.

Автор: Alex Martelli Размещён: 10.07.2010 05:08

7 плюса

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

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

Автор: dan04 Размещён: 13.07.2010 05:47

-4 плюса

У меня есть один простой совет, который вы можете использовать для решения этой проблемы: если в строке оператора 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.

Автор: Clock ZHONG Размещён: 10.08.2016 08:23
Вопросы из категории :
32x32