2010-05-28 3 views
7

면책 조항 : 저는 아직 장고를 배우기 때문에 여기에 뭔가 빠져 있을지 모르지만 그게 뭔지 알 수는 없습니다 ...잠재적 인 장고 버그가있는 QuerySet.query?

저는 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"주위에 따옴표가 붙지 않습니다. 이제 쿼리 을 실행하는 것으로 확인되었습니다. 그래서, 실제로 그렇게해야합니다. 그러나 쿼리를 인쇄하면 잘못 인쇄되는 것은 매우 귀찮은 일입니다. 나는 이런 식으로 뭔가를 ... 한 경우에 특히

당신이 볼 수 있듯이, 완전히 잘못된 SQL 코드를 생성뿐만 아니라 SQL 주입 공격의 씨앗을 가지고뿐만 아니라,
>>> 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`) 
>>> 

. 이제 분명히 이것은 실제로 작동하지 않을 것입니다. (1. 문법은 의도적으로 장고의 행동이 이상하다는 것을 보여주기 위해 잘못되었습니다.) 2. 장고는 실제로 이런 쿼리를 실행하지 않을 것입니다. 실제로 따옴표와 슬래시를 넣고 그 안에있는 모든 것들을 가정합니다.)

그러나 이것은 실제로 디버깅을 혼란스럽게 만들고, 장고 설치로 인해 뭔가 잘못되었는지 궁금합니다.

이 문제가 발생합니까? 그렇다면 파이썬과 장고의 버전은 무엇입니까?

의견이 있으십니까?

+1

'qs.query.as_sql()'을 시도 했습니까? – Amarghosh

+1

제가 이해하는 한, QuerySet.query.as_sql()은 1.2.1 이전의 장고 버전에서 더 이상 작동하지 않습니다. 나는 1.2.1을 사용하여 장고 세계로 들어 왔으므로 상세한 내용을 알지 못한다. 그러나이 주제에 대한 연구에서 내가 발견 한 것이었다. "print qs.query.as_sql()" "AttributeError : 'Query'객체에 설치시 'as_sql'속성이 없습니다. – MikeC8

답변

9

좋아, 나는 그것을 알아 냈다. 그것은 버그가 아닙니다.

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)

모든 게 제대로 작동 : 장고/DB/모델/SQL/query.py의 원인을 찾아. :)

+0

위대한 질문과 대답 (나는 장고로 1 년 넘게 일한 끝에 이것을 알지 못했다). 이것은 제가 잠시 동안 잔소리에 의문을 제기했지만 뭔가를 놓친 것입니다. 이제 나는 무엇을 알고있다. 감사! –

관련 문제