2014-02-15 31 views
0

當我說參數化存儲過程時,我想特別排除任何基於傳入參數,構建字符串和將字符串傳入sp_execute_sql的存儲過程。我的應用程序不會那樣做。SQL注入和參數化SP有限的清理

我有三個問題,我希望有人能夠幫助我。

  1. 參數化存儲過程是否會阻止除潛在SQL注入攻擊之外的所有SQL注入攻擊?

  2. 如果最重要的是,我從任何寫入數據庫的存儲過程中清理所有分號,我是否完全可以避免所有SQL注入攻擊,包括潛在的攻擊?

  3. 如果對上述兩個問題之一的答案不是肯定的,我應該在傳遞參數值之前清除其他哪些字符。

+2

**如果您在考慮「消毒」,那麼您就錯了。**消毒不僅僅是一種方法。相反,你應該考慮「隔離」。這就是sp_executesql爲您所做的:它將查詢的數據部分與查詢的邏輯部分隔離開來。 –

回答

3
  1. 參數化存儲過程(或者未存儲過程甚至個別查詢)將完全防止SQL注入攻擊......至少在那個聲明。這種技術缺乏的是在整個應用程序中執行良好實踐的良好機制。我擔心你從錯誤的方向看待這個問題。你不能通過修正數據庫中的某些東西來防止這種情況。您還需要確保調用數據庫的代碼被正確寫入。即使一個正確的書面存儲過程是脆弱的,如果有人使用不安全的技術來調用該過程。

  2. 不,您仍然可以在一次調用數據庫時執行多個語句。

  3. 沒有可以消除/消毒的單個字符或字符集,以防止這種情況發生。正如我在評論中所說的,如果你想「消毒」,那麼你做錯了。相反,你應該考慮「隔離」。這就是正確的參數化:它將數據隔離在與代碼不同的地方。但這必須在客戶端而不是服務器上進行檢查。

+0

很好的答案。這個問題告訴我,user3312353對SQL注入的理解很差,應該更多地瞭解它。 –

+0

除了讓應用程序僅使用參數化的SP並在將數據傳遞到SP之前對數據進行消毒之外,還可以做些什麼?此外,除我自己之外,除服務帳戶之外,沒有任何人擁有除我授予他們訪問權的特定SP之外的任何數據庫特權。除了我自己擁有DataReader/DataWriter之外,這裏不包含任何人。 – user3312353

+0

@ user3312353如果應用程序僅使用參數化的SP,並正確使用它們,則表示狀態良好。根本沒有必要做任何消毒。訣竅是在整個應用程序中執行此操作,並且您無法在數據庫級知道應用程序正在執行的事實。 –

1

如果你永遠,永遠,永遠使用execute()或sp_execute_sql(如果你一定沒有函數或過程的SP使用呢,要麼),不會發生SQL注入,無論使用什麼參數值傳遞給你的SP。

參數字符串中的SQL關鍵字可能最終被執行爲SQL的唯一方式是,如果您的SP導致運行時執行字符串。

順便說一句,SQL Server不需要語句終止於;字符,因此,如果您在運行時恰好正在將字符串作爲SQL執行,那麼刪除它們將不會阻止多語句注入。