Параметризированные запросы с psycopg2 / DB-API Python и PostgreSQL

Документация для Системы. Гуид. NewGuid () не делает гарантий случайности, поэтому в то время как текущая реализация основана на генераторе случайных чисел (это - версия 4 алгоритма, который был разработан после того, как проблемы конфиденциальности явились результатом версии 1, которая использовала MAC-адрес; другая система как OS X Apple все еще использует версию 1 алгоритма).

Поэтому, в то время как у Вас есть очень высокая вероятность Системы. Гуид. NewGuid () генерация уникального значения, Вы не можете сделать предположения о его предсказуемости, потому что это не определяется документацией.

43
задан Kara 18 October 2013 в 00:37
поделиться

2 ответа

psycopg2 follows the rules for DB-API 2.0 (set down in PEP-249). That means you can call execute method from your cursor object and use the pyformat binding style, and it will do the escaping for you. For example, the following should be safe (and work):

cursor.execute("SELECT * FROM student WHERE last_name = %(lname)s", 
               {"lname": "Robert'); DROP TABLE students;--"})
79
ответ дан 26 November 2019 в 22:39
поделиться

Вот несколько примеров, которые могут оказаться полезными

cursor.execute('SELECT * from table where id = %(some_id)d', {'some_id': 1234})

Или вы можете динамически построить свой запрос на основе словарного имени поля, значения:

fields = ', '.join(my_dict.keys())
values = ', '.join(['%%(%s)s' % x for x in my_dict])
query = 'INSERT INTO some_table (%s) VALUES (%s)' % (fields, values)
cursor.execute(query, my_dict)

Примечание: поля должны быть определены в ваш код, а не , а не пользовательский ввод, иначе вы будете уязвимы для SQL-инъекции.

9
ответ дан 26 November 2019 в 22:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: