【发布时间】: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'”。