2010-05-28 14 views
7

अस्वीकरण: मैं अभी भी Django सीख रहा हूं, इसलिए मुझे यहां कुछ याद आ रहा है, लेकिन मैं नहीं देख सकता कि यह क्या होगा ...QuerySet.query में संभावित Django बग?

मैं पाइथन 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) 
>>> 

ध्यान दें कि यह "ए" या "बी" के आसपास उद्धरण नहीं डालता है! अब, मैंने यह निर्धारित किया है कि क्वेरी ठीक है। तो, हकीकत में, ऐसा करना चाहिए। लेकिन, यह बहुत परेशान है कि क्वेरी को प्रिंट करना गलत प्रिंट करता है। खास तौर पर अगर मैं कुछ इस तरह ... किया

>>> 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. वाक्यविन्यास सभी गलत है, जानबूझकर, Django के व्यवहार की विषमता दिखाने के लिए। 2. Django वास्तव में इस तरह की क्वेरी निष्पादित नहीं करेगा, यह होगा वास्तव में उद्धरण और स्लेश डाल दें और जो कुछ भी ऐसा माना जाता है)।

लेकिन, यह वास्तव में भ्रमित करने में डिबगिंग करता है, और यह मुझे आश्चर्यचकित करता है कि मेरे Django स्थापना के साथ कुछ गलत हो गया है।

क्या यह आपके लिए होता है? यदि ऐसा है, तो आपके पास पाइथन और Django का कौन सा संस्करण है?

कोई विचार?

+1

क्या आपने 'qs.query.as_sql()' कोशिश की? – Amarghosh

+1

जैसा कि मैं इसे समझता हूं, QuerySet.query.as_sql() 1.2.1 से पहले कुछ Django संस्करण के रूप में काम नहीं करता है। मैं 1.2.1 का उपयोग कर Django दुनिया में आया हूं, इसलिए मुझे पूरा विवरण नहीं पता है, लेकिन इस विषय पर मेरे शोध में मैंने जो खोजा है। "प्रिंट qs.query.as_sql()" कारण "विशेषताएँ त्रुटि: 'क्वेरी' ऑब्जेक्ट में मेरी स्थापना पर '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)

सब कुछ ठीक से काम: Django/db/मॉडल/एसक्यूएल/query.py के स्रोत ब्राउज़िंग। :)

+0

महान प्रश्न और उत्तर (मैं Django के साथ काम करने के एक साल बाद इस तरह से नहीं जानता था)। यह कुछ ऐसा है जो मुझे थोड़ी देर के लिए संदेह कर रहा था, लेकिन सिर्फ यह लगा कि मुझे कुछ याद आ रहा था। अब मुझे पता है क्या। धन्यवाद! –

संबंधित मुद्दे