簡體   English   中英

什么時候擔心SQL注入保護

[英]When to worry about SQL injection protection

小背景:我是這家公司唯一的程序員。 我正在使用預先存在的框架。

也就是說,該公司有一個DLL(Database.dll),其中包含“我需要的所有數據庫交互”。 在,它有一個Query()Update()Insert()等。現在,我正在編寫的項目設置對Database.dll的引用。 我的項目接受零用戶輸入。 與用戶輸入最接近的是用戶可以從中選擇日期的下拉框。 沒有太多的經驗,我很好奇我是否還需要擔心SQL注入? 如果是這樣,那么查詢會寫得像

var query = string.Format("SELECT timestamp FROM table1 WHERE date = \"{0}\" 
                           AND measured_dist = bit_loc AND rop > 0" , Date))

足夠作為參數化查詢? 請記住,所有查詢執行都由預先存在的Query() ,我告訴我必須使用它,並且無法編輯。

編輯

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

如評論中所述,答案是“永遠”。 因為將參數添加到那個並且正確地執行它而不是連接將是如此容易 :只是第一次正確地執行它。 另外:你認為注射不是你所展示的代碼中唯一的問題嗎? 該代碼也易受本地化/國際化的影響。 對於在不同文化中配置PC的用戶會發生什么? 日期和數字將以不同的方式呈現 - 並且經常會破壞。 參數不會發生這種情況。 另外:名字經常有撇號:)

擴展@ KirkWoll的非常有效的注釋,只要您在SQL語句中合並任何用戶輸入(或來自自動化源的輸入),就會使您的程序面臨SQL注入的風險。

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

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

如果您之前沒有看過它,那么xkcd就有很好的例證

http://xkcd.com/327/

鑒於這是一個WinForms程序,訪問數據庫的唯一安全方法是使用帶參數的存儲過程。 然后創建只能訪問這些SP的用戶。 其他任何事情都不安全。

雖然帶參數的查詢在與可能具有“攻擊”輸入的Web應用程序一起使用時可用作安全措施,但當與本地應用程序一起使用時,它們會失敗,可以將其拆分並重新寫入任何內容。 如果您不提供SP安全性,則會丟失。

即使用戶交互可能是下拉列表,但復雜的攻擊者也可能插入不在選擇列表中的值。 所以,是的,你仍然應該警惕SQL注入。

即使沒有SQL注入,我也會使用預准備語句。 它們更容易使用,在某些情況下,它們允許數據庫緩存語句,而不必在下次使用時編譯它。 Oracle這樣做,我認為SQL Server確實如此,我不知道MySQL是否這樣做。

你應該總是假設有黑客,即使在內部內部網項目中,我使用預備語句,我使用nonce來防止CSRF。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM