寫給ASP.NET程序員:網(wǎng)站中的安全問題
做項(xiàng)目也有一段時(shí)間了,在程序中也遇到很多安全方面的問題。也該總結(jié)一下了。這個(gè)項(xiàng)目是一個(gè)CMS系統(tǒng)。系統(tǒng)是用ASP.NET做的。開發(fā)的時(shí)候發(fā)現(xiàn)微軟做了很多安全措施,只是有些新手程序員不知道怎么開啟。下面我通過幾個(gè)方面簡單介紹:
1:SQL 注入
2:XSS
3:CSRF
4:文件上傳
SQL 注入
引起原因:
其實(shí)現(xiàn)在很多網(wǎng)站中都存在這種問題。就是程序中直接進(jìn)行SQL語句拼接。可能有些讀者不太明白。下面通過一個(gè)登錄時(shí)對用戶驗(yàn)證來說明:
驗(yàn)證時(shí)的sql語句:
select * from where user='"+txtUsername.Text+"' and pwd='"+txtPwd.Text+"' |
這是一段從數(shù)據(jù)庫中查詢用戶,對用戶名,密碼驗(yàn)證。
看上去好象沒有什么問題,但是實(shí)際這里面淺藏著問題,用戶名:admin 密碼:admin
select * from where user='admin' and pwd='admin' |
如果用戶和密碼正確就可通驗(yàn)證。如果我用戶名:asdf' or 1=1 -- 密碼:隨意輸入.
我們再來看語句:
select * from where user=‘a(chǎn)sdf' or 1=1 -- and pwd='' |
執(zhí)行后看到什么?是不是所有記錄,如果程序只是簡單判斷返回的條數(shù),這種方法就可以通驗(yàn)證。
如果執(zhí)行語句是SA用戶,再通過xp_cmdshell添加系統(tǒng)管理員,那么這個(gè)服務(wù)器就被拿下了。
解決方法:
a. 這個(gè)問題主要是由于傳入特殊字符引起的我們可以在對輸入的用戶名密碼進(jìn)入過濾特殊字符處理。
b. 使用存儲(chǔ)過程通過傳入?yún)?shù)的方法可解決此類問題(注意:在存儲(chǔ)過程中不可使用拼接實(shí)現(xiàn),不然和沒用存儲(chǔ)過和是一樣的)。
XSS(跨站腳本攻擊)
引起原因:
這個(gè)也有時(shí)被人們稱作HTML注入,和sql注入原理相似,也是沒有特殊字符進(jìn)行處理。是用戶可以提交HTML標(biāo)簽對網(wǎng)站進(jìn)行重新的構(gòu)造。其實(shí)在默認(rèn)的情況下在asp.net網(wǎng)頁中是開啟validateRequest屬性的,所有HTML標(biāo)簽后會(huì).NET都會(huì)驗(yàn)證:
但這樣直接把異常拋給用戶,多少用戶體驗(yàn)就不好。
解決方法:
a. 通過在 Page 指令或 配置節(jié)中設(shè)置 validateRequest=false 禁用請求驗(yàn)證,然后我們對用戶提交的數(shù)據(jù)進(jìn)行HtmlEncode,編碼后的就不會(huì)出現(xiàn)這種問題了(ASP.NET 中編碼方法:Server.HtmlEncode(string))。
b. 第二種是過濾特殊字符,這種方法就不太提倡了,如果用戶想輸入小于號(<)也會(huì)被過濾掉.
CSRF(跨站點(diǎn)請求偽造)
引起原因:個(gè)人認(rèn)為csrf在Ajax盛行的今天來說,倒是方便了,因?yàn)樗梢栽谀悴恢赖那闆r用你的通過驗(yàn)證用戶進(jìn)行操作,所以也被稱為瀏覽器劫持。如果你已通過某個(gè)網(wǎng)站的驗(yàn)證那么你將以你的角色對網(wǎng)站進(jìn)行操作,比如你是管理員可以添加其它的用戶到管理組,但是如果有人構(gòu)造了添加管理員的鏈接被管理員點(diǎn)后也會(huì)執(zhí)行相應(yīng)操作.
解決方法:
修改信息時(shí)添加驗(yàn)證碼或添加Session令牌(ASP.NET中已經(jīng)提供一個(gè)自動(dòng)防范的方法,就是用頁面屬性ViewStateUserKey.在Page_Init方法中設(shè)置其值:this.ViewStateUserKey=Session.SessionID)。
文件上傳
引起原因:
如果你的網(wǎng)站使用的是在線編輯器,如FCKEditor,eWeb等等,如果沒有處理好文件上傳,那么上線后網(wǎng)站會(huì)很快的被篡改。
解決方法:
在用戶登錄時(shí)加入是否可上傳文件的Session標(biāo)志。其實(shí)Fckeditor已經(jīng)寫好了。直接把驗(yàn)證函數(shù)CheckAuthentication()中的注釋段中
return ( Session[ "IsAuthorized" ] != null && (bool)Session[ "IsAuthorized" ] == true ); |
注釋去掉。在登錄成功加入
Session[“IsAuthorized”] = true; |
就可以了。
如果網(wǎng)站沒有用到上傳到服務(wù)器的文件瀏覽的話把fckeditor"editor"filemanager中的browser目錄也刪除。
【編輯推薦】