我正在將SQL參數應用於我的項目以防止SQL注入。SQL參數 - 何處使用
是否向我的應用程序中的每個查詢添加參數,包括沒有任何用戶交互的查詢?
例如,如果我的用戶想要搜索關鍵字並提交了文本字段。我已將參數化方法添加到使用該關鍵字的查詢中,以阻止用戶添加惡意內容。但是在這個查詢之下,是另一個查詢,它從頂部搜索中獲得關鍵字ID,並在其他地方運行它自己的小查詢。
這是什麼讓我感到困惑,我是否也將參數方法添加到此查詢中,即使關鍵字ID不是來自用戶?
非常感謝
我正在將SQL參數應用於我的項目以防止SQL注入。SQL參數 - 何處使用
是否向我的應用程序中的每個查詢添加參數,包括沒有任何用戶交互的查詢?
例如,如果我的用戶想要搜索關鍵字並提交了文本字段。我已將參數化方法添加到使用該關鍵字的查詢中,以阻止用戶添加惡意內容。但是在這個查詢之下,是另一個查詢,它從頂部搜索中獲得關鍵字ID,並在其他地方運行它自己的小查詢。
這是什麼讓我感到困惑,我是否也將參數方法添加到此查詢中,即使關鍵字ID不是來自用戶?
非常感謝
是的,在任何你有參數的地方使用參數化查詢。
今天沒有用戶輸入用於特定查詢並不意味着明天將是相同的。代碼更改。也許惡意用戶會想出如何妥協第一個查詢,然後是第二個查詢。您可以考慮defense in depth。
是的,這也應該是一個參數。否則,你必須跟蹤你已經插入到數據庫中的什麼值來自用戶 - 沒有什麼可以阻止「'; 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 + "'");
這將是不正確的 - 因爲應用程序沒有使用外部和變量輸入參數。
請始終使用佔位符(請閱讀:無處不在)。謝謝! :) – 2011-10-12 21:24:29