你的網站正在裸奔嗎?

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防駭指南,也值得看一下。

歡迎推文分享:
Published 07 May 2008 08:04 AM 由 Jeffrey
Filed under: ,
Views: 37,035



意見

# Drick said on 13 May, 2008 10:05 PM

你好,我是新手:

cmd.CommandText = "SELECT Title, Content, Date FROM tblNews WHERE id=" + Request["id"];

想問問這行為什麼會等同於完全公諸於世??

是不是因為沒有用上parameter 把id 引進?

其實使用SQLCommand的parameter是不是真的可以完全解決SQL Injection問題?

# Jeffrey said on 13 May, 2008 11:06 PM

To Drick, 把使用者輸入的內容"直接"變成SQL指令的一部分會讓使用者有機會直接對你的DB下SQL指令,廣義一點來說,只要是使用者輸入的內容,變成網頁的Javascript、DOS或Shell的指令,都一樣有危險。

文中有兩個Link連結到我的兩篇文章,建議你可以參考一下,裡面說得蠻詳細的。

# 蝌蚪 said on 14 May, 2008 11:02 PM

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

多謝李兄分享 :p

# Doris said on 08 September, 2008 07:50 PM

請問一下

文章中的問題二

有提供一隻檢查副程式

其中

if(StrUserid="" or not Is Numeric(StrUserid)) then

裡面的您說的空值 ? 真的是"" 還是 "(空白)"

因為我放"" 一直沒有通過 ..

謝謝您的時間

# Jeffrey said on 08 September, 2008 10:49 PM

to Doris,該範例用於ASP,QueryString中未給UserId參數,Request("UserId")會得到""(空字串),但如果是在ASP.NET中,Request["UserId"] == null(以C#為例),不知你的困擾是不是發生在這上面?

題外話,即使加了參數檢查還是可能會有疏漏,在查詢DB時改用Parameter物件傳參數應該還是較根本的解決做法。

# Phl said on 25 November, 2010 03:05 PM

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

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<May 2008>
SunMonTueWedThuFriSat
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567
 
RSS
創用 CC 授權條款
【廣告】
twMVC

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication