2014-11-25 96 views
4

我似乎無法找到解釋Django內置複雜查詢(Q對象或F對象)的安全性的任何資源。是否有可能在這些查詢中注入SQL攻擊?我做了一個小測試:Django Q對象(複雜查詢)是否安全?

from models import * 
from django.db.models import Q 
q = MyModel.objects.filter(Q(mycolumn__contains='%; DROP DATABASE mydatabase;')) 
print q 
>>> [] 
print q.query 
>>> SELECT `mydatabase_mytable`.`mycolumn` FROM `mydatabase_mytable` WHERE 
    `mydatabase_mytable`.`mycolumn` LIKE BINARY %\%; DROP DATABASE mydatabase;% 

雖然這似乎沒有丟掉我的數據庫。這裏發生了什麼?

回答

5

正如你可以從你的SQL中看到的,Django正在轉義LIKE子句。 Here是對在這種情況下發生的事情的參考。

一般來說,Django確實可以保護您免受SQL注入攻擊。 Here是他們的安全頁面。請注意,通過執行自定義SQL或不小心使用「額外」,您可能會遇到麻煩,但除此之外,您將受到保護。

+0

直接使用'extra()'或使用底層連接/遊標與原始SQL。 – alecxe 2014-11-25 01:08:51