2010-05-28 18 views
7

Yasal Uyarı: Hala Django öğreniyorum, bu yüzden burada bir şey eksik olabilir, ama ben Python 2.6.1 ve Django 1.2.1 koşuyorum ... ne olurduPotansiyel Django Bug QuerySet.query'de mi?

göremez. etrafında "a" ya da "b" tırnak koymak olmadığını

(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) 
>>> 

Bildirimi! Şimdi, sorgusunun sorgusunu gerçekleştirdiğini belirledim. Yani, gerçekte, öyle yapıyor olmalı. Ancak, sorgunun yazdırılmasının yanlış yazdırması oldukça can sıkıcıdır. Böyle bir şey ... yaptım Özellikle

gördüğünüz gibi, tamamen hatalı biçimlendirilmiş bir SQL kodunu oluşturur, aynı zamanda SQL enjeksiyon saldırısı tohumlarını sahiptir kalmaz,
>>> 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`) 
>>> 

. Şüphesiz, bu durum aslında pek çok nedenden ötürü işe yaramayacaktır (1. Sözdizimi, Django'nun davranışının tuhaflığını göstermek için kasıtlı olarak yanlıştır.) 2. Django, bu gibi bir sorguyu yürütmeyecektir. aslında tırnaklar ve eğik çizgi ve orada olması gerektiği gibi her şeyi koydu).

Ancak, bu gerçekten hata ayıklamayı kafa karıştırıcı yapar ve Django yüklememde bir şeyler ters gittiğinde beni meraklandırır.

Bu sizin için mi oluyor? Eğer öyleyse, Python ve Django'nun hangi versiyonuna sahipsiniz?

Herhangi bir düşünce?

+1

'qs.query.as_sql()' yi denediniz mi? – Amarghosh

+1

Anladığım kadarıyla, QuerySet.query.as_sql() işlevi artık 1.2.1'den önceki bazı Django sürümleri arasında çalışmaz. 1.2.1 kullanarak Django dünyasına girdim, bu yüzden tüm detayları bilmiyorum, ancak bu konudaki araştırmamda keşfettiğim şey bu. "print qs.query.as_sql()" neden olur "AttributeError: 'Query' nesnesinin" as_sql "özniteliği benim kurulumda yok. – MikeC8

cevap

9

Tamam, sadece anladım. Bu bir hata değil.

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)

Her şey düzgün çalışıyor: Django/db/modelleri/sql/query.py kaynağını dolaşma. :)

+0

Harika bir soru ve cevap (Bunu bir yıldan fazla bir süre sonra Django ile çalıştıktan sonra bilmiyordum). Bu bir süredir şüphe duyduğum bir şeydi, ama bir şeylerin eksik olduğunu anladım. Şimdi ne olduğunu biliyorum. Teşekkürler! –