2013-01-16 53 views
6

小背景:我是這家公司唯一的程序員。我正在使用預先存在的框架。何時擔心SQL注入保護

這就是說,該公司有一個dll(Database.dll),其中包含「我需要的所有數據庫交互」。如在中,它有一個Query(),Update(),Insert()等。現在,我正在編寫的項目設置了對Database.dll的引用。我的項目接受零用戶輸入。最接近用戶輸入的是用戶可以從中選擇日期的下拉框。沒有太多的經驗,我很好奇,如果我仍然需要擔心SQL注入?如果是這樣,會寫一個類似於

作爲參數化查詢就足夠嗎?請記住,所有的查詢執行都由已知的Query()來處理,我被告知必須使用它,並且無法編輯。

EDIT

該方案是一個WinForm應用程序。

+19

正確答案是「永遠」。 –

+0

你應該總是與它有關,但它聽起來像的唯一途徑有人開發者可以提交數據庫請求的外面是通過一個下拉菜單選擇,以便有很少的機會,他們可以注入任何東西。這是一個Web應用程序或控制檯應用程序,有一個Web應用程序會大大增加風險,因爲不同的方式發佈。使用控制檯應用程序它可能不會有太大的問題。 – Robert

+3

除非你正在做一些無法參數化的東西,否則只需進行參數化即可。除了安全性之外,您可能會獲得性能提升:參數化將使您的RDBMS節省參數化查詢本身的工作量,使其與執行計劃相匹配。一個客戶端,你不需要分配/格式化大量的字符串,代碼更整潔等等。 –

回答

6

正如評論中指出的那樣,答案是「永遠」。既然那麼容易給它添加一個參數並且正確地執行它,而不是連接:只是第一次做對。另外:你認爲注射不是你顯示的代碼中唯一的問題嗎?該代碼也易於本地化/國際化。對於配置了不同文化背景的用戶,會發生什麼情況?日期和數字會以不同方式呈現 - 並且會經常中斷。這不會發生在參數上。此外:名稱通常在撇號:)

+0

@ Marc Gravell - 很好說。我只是想問一下那些事情。 +1 – Brian

+0

@MarcGravell:我查詢的數據庫的格式(YYYY-mm-dd)在每種情況下都是相同的,我將'Date'格式化爲適合該格式。從我正在閱讀的關於參數化查詢的內容來看,當命令執行由另一種方法處理時,可以這樣做嗎?我一直在閱讀[this](http://blog.divergencehosting.com/2009/04/09/using-parameters-parameterized-queries-database-interactions-cshar-vbnet/),但它似乎是查詢使用執行它的相同方法創建。 – MyCodeSucks

+0

@MarcGravell - 這是一個C#本地應用程序。參數不夠。需要有一個特定的用戶和存儲過程(這是用戶唯一的訪問),否則很容易看到應用程序內部並獲取連接字符串並進入城鎮。 – Hogan

4

對於@ KirkWoll的非常有效的評論,無論您何時在SQL語句中包含任何用戶輸入(或來自自動化源的輸入),都會將您的程序置於SQL注入風險中。

作爲一個策略問題,您永遠不應該使用任何此類輸入構建自己的SQL語句。

始終對輸入進行清理並始終使用參數化查詢作爲針對SQL注入的第一道防線。

在你還沒有看到它之前,有上XKCD一個偉大的例證

http://xkcd.com/327/

+3

哈哈,我愛小鮑比表。謝謝你的笑聲。 +1 – MyCodeSucks

+0

+1爲鮑比表 – SmartK8

+0

這是一個非常有趣的卡通。 –

1

即使用戶交互可能是一個下拉,有可能爲一個熟練的攻擊者插入值情況這不在選擇列表中。所以是的,你仍然應該警惕SQL注入。

+0

甚至不是一個「複雜」的攻擊者。具有適度編程技能的任何人都可以在HTML上查看源代碼,根據自己的喜好進行編輯,然後使用它代替原始HTML。那些具有更多技能的人可以使用瀏覽器加載項來半自動化該過程。 –

+2

即使在WinForms應用程序中? –

+0

是的,從這個問題我不清楚它是否專門針對HTML界面。如果它是某種桌面應用程序,它可能需要更多的技巧,巴特的評論。 – jimbojw

0

即使沒有SQL注入等事情,我也會使用預準備語句。它們只是更容易使用,在某些情況下它們允許數據庫緩存語句,而不必在下次使用它時進行編譯。 Oracle做到了這一點,我認爲SQL Server的確如此,我不知道MySQL是否會這樣做。

即使在內部Intranet項目中,也應該假定存在黑客,我使用準備好的語句,並使用nonces來防止CSRF。

2

鑑於這是一個WinForms程序,訪問數據庫的唯一安全方法是使用帶參數的存儲過程。然後創建一個用戶,只有有權訪問這些SP。其他任何東西都不安全。

雖然與參數的查詢與可以有「攻擊」的Web應用程序使用時,作爲一種安全措施工作投入,與本地應用程序,它可以DIS組裝並重新寫入任何東西使用時失敗。如果您不提供SP安全性,您將會丟失。