2010-05-28 19 views
7

Tuyên bố từ chối trách nhiệm: Tôi vẫn đang học Django, vì vậy tôi có thể thiếu một số thứ ở đây, nhưng tôi không thể xem nó là gì ...Lỗi Django tiềm năng Trong QuerySet.query?

Tôi đang chạy Python 2.6.1 và 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) 
>>> 

Lưu ý rằng nó không đặt dấu ngoặc kép xung quanh "a" hoặc "b"! Bây giờ, tôi đã xác định rằng truy vấn thực hiện tiền phạt. Vì vậy, trong thực tế, nó phải làm như vậy. Nhưng, nó khá khó chịu mà in ra các truy vấn in nó sai. Đặc biệt là nếu tôi đã làm một cái gì đó như thế này ...

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

nào, như bạn có thể thấy, không chỉ tạo ra mã SQL hoàn toàn bị thay đổi, nhưng cũng có những hạt giống của một cuộc tấn công SQL injection. Bây giờ, rõ ràng điều này sẽ không thực sự làm việc, cho khá một số lý do (1. Cú pháp là tất cả sai, cố ý, để cho thấy sự kỳ quặc của hành vi của Django. 2. Django sẽ không thực sự thực hiện các truy vấn như thế này, nó sẽ thực sự đặt dấu ngoặc kép và dấu gạch chéo và tất cả những gì trong đó như nó được cho là).

Nhưng, điều này thực sự làm cho gỡ rối khó hiểu, và nó làm cho tôi tự hỏi nếu có điều gì đó không ổn với cài đặt Django của tôi.

Điều này có xảy ra với bạn không? Nếu có thì không, bạn có phiên bản Python và Django nào?

Mọi suy nghĩ?

+1

bạn đã thử 'qs.query.as_sql()' chưa? – Amarghosh

+1

Như tôi đã hiểu, QuerySet.query.as_sql() không còn hoạt động như một số phiên bản Django trước 1.2.1. Tôi đã đi vào thế giới Django bằng cách sử dụng 1.2.1, vì vậy tôi không biết chi tiết đầy đủ, nhưng trong nghiên cứu của tôi về chủ đề này đó là những gì tôi phát hiện ra. "in qs.query.as_sql()" gây ra "AttributeError: đối tượng 'Truy vấn' không có thuộc tính 'as_sql'" trong quá trình cài đặt của tôi. – MikeC8

Trả lời

9

Ok, tôi đã tìm ra. Nó không phải là một lỗi. Duyệt nguồn django/db/mô hình/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)

Tất cả mọi thứ của hoạt động đúng. :)

+0

Câu hỏi và trả lời tuyệt vời (Tôi không biết điều này bằng cách này sau hơn một năm làm việc với Django). Đây là điều tôi đã nghi ngờ về một thời gian, nhưng chỉ nghĩ rằng tôi đã bỏ lỡ điều gì đó. Bây giờ tôi biết những gì. Cảm ơn! –

Các vấn đề liên quan