Хорошо, я не настолько разбираюсь в Python.
У меня есть следующий код Python:
cursor.execute("INSERT INTO table VALUES var1, var2, var3,")
где var1
целое число,var2
& var3
- строки.
Как я могу написать имена переменных без включения их Python в текст запроса?
%
. Собственно, я так и говорю в ответе.%
вместо,
строки и переменных ... не могу отменить мой голосование по разным причинам ... Я лично хотел бы видеть такие слова, как небезопасный / атака и т. д., упомянутые в описании, где вы говорите не 't use%
..%
оператор для форматирования строки. Те,%
что указаны в строке, используютсяcursor.execute
напрямую, и, поскольку он знает, что генерирует SQL, он может сделать больше для вашей защиты.Различные реализации Python DB-API могут использовать разные заполнители, поэтому вам нужно выяснить, какой из них вы используете - это может быть (например, с MySQLdb):
cursor.execute("INSERT INTO table VALUES (%s, %s, %s)", (var1, var2, var3))
или (например, с sqlite3 из стандартной библиотеки Python):
cursor.execute("INSERT INTO table VALUES (?, ?, ?)", (var1, var2, var3))
или другие (после
VALUES
того, как вы могли иметь(:1, :2, :3)
, или "именованные стили",(:fee, :fie, :fo)
или(%(fee)s, %(fie)s, %(fo)s)
где вы передаете dict вместо карты в качестве второго аргументаexecute
). Проверьтеparamstyle
строковую константу в используемом вами модуле API БД и найдите paramstyle на http://www.python.org/dev/peps/pep-0249/, чтобы узнать, что такое все стили передачи параметров!источник
Много способов. НЕ используйте наиболее очевидный (
%s
с%
) в реальном коде, он открыт для атак .Здесь скопировано из pydoc sqlite3 :
# Never do this -- insecure! symbol = 'RHAT' c.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol) # Do this instead t = ('RHAT',) c.execute('SELECT * FROM stocks WHERE symbol=?', t) print c.fetchone() # Larger example that inserts many records at a time purchases = [('2006-03-28', 'BUY', 'IBM', 1000, 45.00), ('2006-04-05', 'BUY', 'MSFT', 1000, 72.00), ('2006-04-06', 'SELL', 'IBM', 500, 53.00), ] c.executemany('INSERT INTO stocks VALUES (?,?,?,?,?)', purchases)
Еще примеры, если вам нужно:
# Multiple values single statement/execution c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', ('RHAT', 'MSO')) print c.fetchall() c.execute('SELECT * FROM stocks WHERE symbol IN (?, ?)', ('RHAT', 'MSO')) print c.fetchall() # This also works, though ones above are better as a habit as it's inline with syntax of executemany().. but your choice. c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', 'RHAT', 'MSO') print c.fetchall() # Insert a single item c.execute('INSERT INTO stocks VALUES (?,?,?,?,?)', ('2006-03-28', 'BUY', 'IBM', 1000, 45.00))
источник
http://www.amk.ca/python/writing/DB-API.html
Будьте осторожны, когда вы просто добавляете значения переменных к своим операторам: представьте, что пользователь называет себя
';DROP TABLE Users;'
- вот почему вам нужно использовать экранирование sql, которое Python предоставляет вам, когда вы используете cursor.execute достойным образом. Пример в URL-адресе:cursor.execute("insert into Attendees values (?, ?, ?)", (name, seminar, paid) )
источник