星期一, 4月 17, 2006

10分鐘做好SQL Injection 的防範



 SQL Injection的防護是個老課題,但最近卻發現很多新手programmer還是沒搞懂,管理的方式也沒抓到,許多網站在開發時還是漏洞百出,原因大都是架構鬆散,程式人員偷懶的緣故,關於SQL Injection的原理,在此不多敘述,許多文章都有提過,如



如果懂SQL語法的人,都知道,主要是因為沒有擋單引號和--註解符號,及Web server錯誤訊息內容,完美的改善方式應該是用ADO command物件加stored procedure的方式去修改,但須改的地方會相當多,也會花很多時間,

但若自己的網站程式老舊,沒有做防護措施,被hacker亂改資料,想在最短時間上線,要如何應對呢?!

 

1.關閉服務

先關閉網站對外的服務,但內部可以連結測試,如果有開發機可以測試的公司,可以直接貼公告,告訴客戶系統維護中。

 

2.搜尋問題

用搜尋檔案資料的方式,找出網站根目錄下所有有下request的程式碼,如果有裝visual studio這類的專案開發工具,可以在開發環境直接尋找。

錯誤的SQL command 通常長的像這樣

userid=request("userid")

pwd=request("pwd")

strSQL="select userid,pwd from tblMember where userid='" & userid & "' and pwd='" & pwd & "'"

 

或者是

productId=request("productid")

strSQL="select * from tblProduct where productid='" & productid & "'"

 

 

3.加入檢驗

將所有request加上過濾單引號的function

function escape(input,slen)

 

input=left(replace(request("input"),"'","''"),slen)

escape=input

 

end function

 

userid=escape(request("userid"),欄位長度)

 

如果產品序號一定是數值還可以加上數值判斷

 

4. 改變資料庫存取的帳號及權限

通常SQL injection一開啟,很多資料可能已經透過系統的store procedure外流,因此新增一個帳號,把舊的帳號密碼換掉,新增一個有權限限制只能存取web database的帳號,改變程式碼的connection string,並將沒有用到的database 如 Northwind、 Pub 移除。

 

 

5.改寫IIS的錯誤顯示頁

頁面經測試都沒問題後,將IIS HTTP 500 和 400的錯誤頁面改掉,就不會在程式錯誤時把table name 和 SQL語法顯示出來

 

已上是建議舊網站的快速解決方式,不要花大錢重寫,經濟實惠。

 

 

 

 

 

 

 

 

沒有留言: