gpt4 book ai didi

python - QuerySet.query 中潜在的 Django 错误?

转载 作者:太空狗 更新时间:2023-10-29 21:35:43 26 4
gpt4 key购买 nike

免责声明:我还在学习 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 注入(inject)攻击埋下了种子。现在,显然这实际上行不通,原因有很多(1. 语法都是错误的,故意的,以显示 Django 行为的古怪。2. Django 实际上不会像这样执行查询,它会实际上把引号和斜杠和所有的东西都放在里面,就像它应该的那样)。

但是,这确实让调试变得困惑,这让我怀疑我的 Django 安装是否出了问题。

这会发生在你身上吗?如果是/不是,你有什么版本的 Python 和 Django?

有什么想法吗?

最佳答案

好吧,我刚刚弄明白了。这不是错误。浏览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 )

一切正常。 :)

关于python - QuerySet.query 中潜在的 Django 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2926483/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com