SQL Injection真的是老掉牙的話題了,很不幸地,它卻始終是導致資安事件的主要凶手之一。

只要一個好傻好天真的程式設計師寫錯一行程式碼(例如: cmd.CommandText = "SELECT Title, Content, Date FROM tblNews WHERE id=" + Request["id"];),不管你用的是ASP、JSP還是PHP,資料庫連的是SQL、MySQL還是ORACLE,整個資料庫等同於完全公諸於世,任人把玩。原本應該要固若金湯的網站系統,這下跟在大街上裸奔沒有兩樣。

這是我很早以前在RUN!PC發表過的文章,源於一個自己遇到的真實案例(一個兩三千人活動的網站),文章裡很寫實地展示了不留意SQL Injection的問題,後果可能有多嚴重。幾年後,隨著駭客自動工具的不斷研發及技術提升,SQL Injection的威脅更是有增無減,所有開發人員務必要建立正確的觀念,審慎因應。

文章在此,僅供大家參考。

另外,還有另一篇文章--ASP.NET防駭指南,也值得看一下。


Comments

# by Drick

你好,我是新手: cmd.CommandText = "SELECT Title, Content, Date FROM tblNews WHERE id=" + Request["id"]; 想問問這行為什麼會等同於完全公諸於世?? 是不是因為沒有用上parameter 把id 引進? 其實使用SQLCommand的parameter是不是真的可以完全解決SQL Injection問題?

# by Jeffrey

To Drick, 把使用者輸入的內容"直接"變成SQL指令的一部分會讓使用者有機會直接對你的DB下SQL指令,廣義一點來說,只要是使用者輸入的內容,變成網頁的Javascript、DOS或Shell的指令,都一樣有危險。 文中有兩個Link連結到我的兩篇文章,建議你可以參考一下,裡面說得蠻詳細的。

# by 蝌蚪

今天早上公司內部開了個有關 SQL Injection 的會議, 會中同事所準備的投影片中有一個 link 覺得眼熟, 仔細一看 URL 發現就是李兄的這篇文章~~ 多謝李兄分享 :p

# by Doris

請問一下 文章中的問題二 有提供一隻檢查副程式 其中 if(StrUserid="" or not Is Numeric(StrUserid)) then 裡面的您說的空值 ? 真的是"" 還是 "(空白)" 因為我放"" 一直沒有通過 .. 謝謝您的時間

# by Jeffrey

to Doris,該範例用於ASP,QueryString中未給UserId參數,Request("UserId")會得到""(空字串),但如果是在ASP.NET中,Request["UserId"] == null(以C#為例),不知你的困擾是不是發生在這上面? 題外話,即使加了參數檢查還是可能會有疏漏,在查詢DB時改用Parameter物件傳參數應該還是較根本的解決做法。

# by Phl

搞了很多年的PL SQL.最近改搞ASP MVC. 原來當中還有如此學問. 謝過版主了.

Post a comment