2015-06-19 64 views
0

如果參數是字符串,Django的原始SQL功能會在傳遞給SQL查詢的任何參數周圍添加單引號。是否有可能阻止Django圍繞原始SQL參數添加引號?

這打破了我,當我需要做這樣的查詢:

SELECT * FROM table WHERE id IN (%s)

的參數是一個字符串,如「1,2,3」,所以Django的渲染查詢爲:

SELECT * FROM table WHERE id IN ('1,2,3')

周圍帕拉姆這些報價中斷查詢。

在我看來,Django迫使我使用字符串插值(即在參數在原始查詢中使用之前將參數注入到字符串中),但文檔明確指出我們不應該那樣做。

從文檔:

使用把params參數完全保護您免受SQL注入攻擊 ,共同開發,其中攻擊者注入任意SQL進入 數據庫。如果你使用字符串插值,遲早你會成爲SQL注入的犧牲品。只要你記得總是使用 params參數,你就會受到保護。

有沒有辦法關掉報價?如果我們想要報價,我們可以添加它們,不是嗎? (例如WHERE name ='%s')

回答

1

Django原始查詢需要將parameters作爲單個列表或字典。所以在這種情況下,你應該調用你的原始查詢是這樣的:

YourModel.objects.raw('SELECT * FROM table WHERE id in %s', [(1, 2, 3, 4, 5, ...)])

+0

我明白了。它接受一個整數列表。我想我必須將整數列表格式化爲一個字符串,這就是我如何得到引號。 – John

相關問題