Как просмотреть выполняемый запрос, сгенерированный peewee?

Попробовал провести sql-инъекцию, но результата не было. Но если вывести запрос, то он рабочий.

Подготовил код для тестирования:

from peewee import *

db = SqliteDatabase('people.db')

class Person(Model):
    name = CharField()

    class Meta:
        database = db

db.connect()
db.create_tables([Person])

for i in range(5):
    Person(name=f'name_{i+1}').save()

query = Person.select().where(Person.name == "123' or '1' = '1")
print(query)
print(len(list(query)))

Результат:

SELECT "t1"."id", "t1"."name" FROM "person" AS "t1" WHERE ("t1"."name" = '123' or '1' = '1')
0

Как видно, запрос валидный, но ничего не вернуло.

Попробуем выполнить этот же запрос:

введите сюда описание изображения

Запрос валидный.

Так что же на самом деле передает драйверу базы данных?

Как посмотреть этот запрос?


Ответы (1 шт):

Автор решения: gil9red

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

import logging
logger = logging.getLogger('peewee')
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.StreamHandler())

И как видим, данные передаются через биндинг, поэтому будет экранировано и не будет опасности sql-инъекции:

SELECT "t1"."id", "t1"."name" FROM "person" AS "t1" WHERE ("t1"."name" = '123' or '1' = '1')
0
('SELECT "t1"."id", "t1"."name" FROM "person" AS "t1" WHERE ("t1"."name" = ?)', ["123' or '1' = '1"])
→ Ссылка