QuerySet.query中潜在的Django错误?

时间:2010-05-28 03:27:37

标签: python django

免责声明:我还在学习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?

有什么想法吗?

1 个答案:

答案 0 :(得分:10)

好的,我刚想通了。这不是一个错误。浏览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

一切正常。 :)