2011-10-12 67 views
2

我正在將SQL參數應用於我的項目以防止SQL注入。SQL參數 - 何處使用

是否向我的應用程序中的每個查詢添加參數,包括沒有任何用戶交互的查詢?

例如,如果我的用戶想要搜索關鍵字並提交了文本字段。我已將參數化方法添加到使用該關鍵字的查詢中,以阻止用戶添加惡意內容。但是在這個查詢之下,是另一個查詢,它從頂部搜索中獲得關鍵字ID,並在其他地方運行它自己的小查詢。

這是什麼讓我感到困惑,我是否也將參數方法添加到此查詢中,即使關鍵字ID不是來自用戶?

非常感謝

+0

請始終使用佔位符(請閱讀:無處不在)。謝謝! :) – 2011-10-12 21:24:29

回答

5

是的,在任何你有參數的地方使用參數化查詢。

今天沒有用戶輸入用於特定查詢並不意味着明天將是相同的。代碼更改。也許惡意用戶會想出如何妥協第一個查詢,然後是第二個查詢。您可以考慮defense in depth

+0

+1「在任何有參數的地方使用參數化查詢」。不能更簡單 –

+2

這裏的傑夫阿特伍德關於這個問題:http://www.codinghorror.com/blog/2005/04/give-me-parameterized-sql-or-give-me-death.html – Rikon

+0

+1 Jeff,有趣的文章 – TheCarver

2

是的,這也應該是一個參數。否則,你必須跟蹤你已經插入到數據庫中的什麼值來自用戶 - 沒有什麼可以阻止「'; DROP DATABASE」的名稱。如果您盲目地信任數據庫中的數據以進行消毒,那麼在某些時候您肯定會弄錯它。

喜歡的東西:

SELECT Rows FROM TABLE2 WHERE KeywordId = (
    SELECT KeywordId FROM TABLE1 WHERE UserInput = @u 
) 

將是確定的,因爲你的SQL引擎將在內部使用的參數。這是這樣的邏輯:

var keywordId = sql_exec("SELECT KeywordId FROM Table1 WHERE UserInput = @u", userInput); 
var rows = sql_exec("SELECT Rows FROM Table2 WHERE KeywordId = '" + keywordId + "'"); 

這將是不正確的 - 因爲應用程序沒有使用外部和變量輸入參數。