我想在這裏簡單地證明了這個簡單的功能不夠好,以防止在世界上每一個SQL注入:機器證明SQL注入
Function CleanForSQL(ByVal input As String) As String
Return input.Replace("'", "''")
End Function
這裏是我們的應用程序的一個典型INSERT語句:
Database.DBUpdate("UPDATE tblFilledForms SET Text1 = '" + CleanForSQL(txtNote.Text) + "' WHERE FilledFormID = " + DGVNotes.SelectedRows(0).Cells("FilledFormID").Value.ToString)
我知道它不安全,因爲使用谷歌搜索和查找StackOverflow.com上的其他問題。 Here是我發現的一個問題,其中所有功能(如上面提到的功能)都是無關緊要的。
因此,基於我掛了後,只需鍵入
「CHR(8);更新tblMaint SET值1 = 2 WHERE VALUEID = 2--
到txtNote應該足以在整個tblFilledForms表的text1清除每一個值,然後更新tblmaint表的第二行是2是否正確?
這裏什麼應該發生的是,VB將其解釋爲
UPDATE tblFilledForms SET文本1 = '''CHR(8);更新tblMaint SET值1 = 2 WHERE VALUEID = 2-- 'WHERE FilledFormID = 5120327
並將其發送到SQL將實習生執行CHR(8)以擦除第三',這將產生
UPDATE tblFilledForms SET Text1 ='';更新tblMaint SET Value1 = 2 WHERE ValueID = 2--'WHERE FilledFormID = 5120327
對數據庫實際執行正確嗎?
然後,我從剪貼板中複製了一個Chr(8),並將文本框中的Chr(8)替換爲剪貼板內容,但仍然是禁用。它將整個字符串直接放入字段中,不存在問題。
那麼我在這裏做錯了什麼?或者我還能做些什麼來打破它?
技術和背景: 我使用MS SQL Server 2005中,和VB .NET 2005 在數據庫中的文本1場是一個varchar(600)字段(不要問我爲什麼它不MAX,它是毫無意義的,我知道) 表中有某些觸發器可以防止這種大規模更新,並且如果注入實際上正常工作時會拋出一些錯誤。
PS。我知道參數化查詢是去這裏的方式,我不在尋找像「我不明白爲什麼它不起作用,但參數化查詢是要走的路」這樣的答案。我正在尋找證明我們的軟件被破壞的能力,並且我們需要使用更好的原則來重寫它。
對於任何人閱讀這個問題想弄清楚如何更好地過濾文本字段,答案是不!使用參數!他們更好,更安全,更容易!
對同一段落中的威脅人和寫作原則而不是原則的投降。 – 2009-12-02 17:20:27
你的Chr(8)最終在一個字符串內部,這就是爲什麼SQL不評估它。 – 2009-12-02 17:21:18
@Vinko我認爲這不公平,他只是設定了答案的指導方針。所以,不要得到大量的答案都說同樣的事情,他得到1或2,告訴他他想要什麼。 – Zoidberg 2009-12-02 17:22:43