Потенциал ошибка Django в QuerySet.query?

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

Я запускаю 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 Вы имеете?

Какие-либо мысли?

7
задан MikeC8 28 May 2010 в 03:27
поделиться

1 ответ

Хорошо, я только что понял. Это не ошибка. Просмотр источника 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 )

Все работает нормально. :)

10
ответ дан 7 December 2019 в 01:17
поделиться
Другие вопросы по тегам:

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