Потенциальная ошибка Django в QuerySet.query? - PullRequest
7 голосов
/ 28 мая 2010

Отказ от ответственности: Я все еще изучаю Джанго, поэтому я мог бы что-то здесь упустить, но я не вижу, что это будет ...

Я использую Python 2.6.1 и Django 1.2.1.

(InteractiveConsole)
>>> from myproject.myapp.models import *
>>> qs = Identifier.objects.filter(Q(key="a") | Q(key="b"))
>>> print qs.query
SELECT `app_identifier`.`id`, `app_identifier`.`user_id`, 
`app_identifier`.`key`, `app_identifier`.`value` FROM
`app_identifier` WHERE (`app_identifier`.`key` = a  OR
`app_identifier`.`key` = b )
>>>

Обратите внимание, что он не ставит кавычки вокруг "a" или "b"! Теперь я определил, что запрос выполняется нормально. Так что, на самом деле, это должно быть так. Но довольно неприятно, что распечатка запроса печатает его неправильно. Особенно, если я сделал что-то подобное ...

>>> qs = Identifier.objects.filter(Q(key=") AND") | Q(key="\"x\"); DROP TABLE      
                `app_identifier`"))
>>> print qs.query
SELECT `app_identifier`.`id`, `app_identifier`.`user_id`,
`app_identifier`.`key`, `app_identifier`.`value` FROM
`app_identifier` WHERE (`app_identifier`.`key` = ) AND  OR
`app_identifier`.`key` = "x"); DROP TABLE `app_identifier` )
>>> 

Который, как вы можете видеть, не только создает полностью искаженный код SQL, но также имеет семена атаки SQL-инъекцией. Теперь, очевидно, это не будет работать по целому ряду причин (1. Синтаксис преднамеренно неверен, чтобы показать странность поведения Django. 2. Django на самом деле не выполнит запрос, как это на самом деле помещать кавычки и косые черты и все такое, как положено).

Но это действительно сбивает с толку отладку, и я задаюсь вопросом, что-то пошло не так с моей установкой Django.

Это происходит для вас? Если да / нет, то какая у вас версия Python и Django?

Есть мысли?

1 Ответ

10 голосов
/ 28 мая 2010

Хорошо, я только что понял это. Это не ошибка. Просмотр источника django / db / models / sql / query.py:

160     def __str__(self):
161         """
162         Returns the query as a string of SQL with the parameter values
163         substituted in.
164 
165         Parameter values won't necessarily be quoted correctly, since that is
166         done by the database interface at execution time.
167         """
168         sql, params = self.get_compiler(DEFAULT_DB_ALIAS).as_sql()
169         return sql % params

(http://code.djangoproject.com/browser/django/trunk/django/db/models/sql/query.py)

Все работает правильно. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...