Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 6, 2011 21:45:44

hippi90
От:
Зарегистрирован: 2011-04-06
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Подстановка в Sqlite3

Python изучаю не так давно, в основном на С пишу, Sqlite и того меньше.
Есть база данных Sqlite и скрипт на Python3, который этой базой управляет. В скрипте есть функция, которая создает новую таблицу в базе по шаблону, в качестве аргументов принимает имя базы и имя новой таблицы:

def create_new_table_in_db(db, table):
conn = sqlite3.connect(db)
cur = conn.cursor()

cur.execute('''DROP TABLE IF EXISTS ?''', (table,))
        ...
При выполнении выдает ошибку на последней строке:
cur.execute("DROP TABLE IF EXISTS ?", (table,))
sqlite3.OperationalError: near "?": syntax error
Если заменить ? на имя таблицы, то выполняется без ошибок:
cur.execute("DROP TABLE IF EXISTS test_table")
Смотрел примеры из документации http://docs.python.org/py3k/library/sqlite…=sqlite#sqlite3, смотрел также в нескольких книгах по питону, пример типа такого работает на ура:
data = [("Ivanov", "ASM", ".pdf", "None"),\
("Petrov", "C++", ".pdf", "None"),\
("Sidorov", "Python", ".djvu", "None")]

cur.executemany("""INSERT INTO test_table values(?, ?, ?, ?)""", data)
Почему в первом случае не работает, а во втором работает? Или Sqlite не всегда выполняет подстановку переменных? Где тогда посмотреть список этих случаев?
В официальной документации сказано:
# Never do this -- insecure!
symbol = 'IBM'
c.execute("... where symbol = '%s'" % symbol)
А если я выполню:
s = "test_table"
cur.execute("DROP TABLE IF EXISTS %s" % s)
Насколько это будет небезопасно, и есть ли “правильные” способы подстановки?



Офлайн

#2 Апрель 7, 2011 10:40:41

Studentik
От:
Зарегистрирован: 2009-12-26
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

Подстановка в Sqlite3

hippi90
в качестве аргументов принимает имя базы и имя новой таблицы
Этого синтаксис не позволяет. Параметры могут быть только там, где по синтаксису должен быть expression.

Склеивать динамические запросы к базе безопасно, если только потенциальный злоумышленник не может произвольно менять переменные, из которых склеивается запрос.
http://ru.wikipedia.org/wiki/Внедрение_SQL-кода



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version