【问题标题】:Potential Django Bug In QuerySet.query?QuerySet.query 中潜在的 Django 错误?
【发布时间】:2010-05-28 03:27:36
【问题描述】:

免责声明:我还在学习 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”周围加上引号!现在,我确定查询 executes 正常。因此,实际上,它必须这样做。但是,打印出查询会打印错误,这很烦人。特别是如果我做了这样的事情......

>>> 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?

有什么想法吗?

【问题讨论】:

  • 你试过qs.query.as_sql()吗?
  • 据我了解,QuerySet.query.as_sql() 不再适用于 1.2.1 之前的某些 Django 版本。我使用 1.2.1 进入 Django 世界,所以我不知道全部细节,但在我对这个主题的研究中,我发现了这一点。 “print qs.query.as_sql()”在我的安装中导致“AttributeError: 'Query' object has no attribute 'as_sql'”。

标签: python django


【解决方案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)

一切正常。 :)

【讨论】:

  • 很好的问答(顺便说一句,在与 Django 合作一年多之后,我不知道这一点)。这是我一段时间以来一直在犹豫的事情,但只是发现我错过了一些东西。现在我知道了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 1970-01-01
  • 2021-05-26
  • 1970-01-01
相关资源
最近更新 更多