在網路經常看到網站被掛馬、首頁被修改的新聞,其實這些問題可能是多方面的,伺服器,網站程式等等。但是現在溢出已經被人們重視和伺服器的不斷完善,伺服器系統漏洞也不是那麼容易發掘,當然也要保證第三方的軟體安全。
做項目也有一段時間了。在程式中也遇到很多安全方面的問題。也該總結一下了。這個項目是一個CMS系統。系統是用ASP.NET做的。開發的時候發現微軟做了很多安全措施,只是有些新手程式員不知道怎麼開啟。下面我通過幾個方面簡單介紹:
1:SQL 注入
2:XSS
3:CSRF
4:檔案上傳
1:SQL 注入
引起原因:
其實現在很多網站中都存在這種問題。就是程式中直接進行SQL語句拼接。可能有些讀者不太明白。下面通過一個登入時對使用者驗證來說明:
code:
驗證時的sql語句: select * from where user='"+txtUsername.Text+"' and pwd='"+txtPwd.Text+"'
這是一段從資料庫中查詢使用者,對使用者名稱,密碼驗證。
看上去好象沒有什麼問題,但是實際這裡面淺藏著問題,使用者名稱:admin 密碼: admin,
select * from where user='admin' and pwd='admin'
如果使用者和密碼正確就可通驗證。如果我使用者名稱:asdf' or 1=1 -- 密碼:隨意輸入.
我們再來看語句:
select * from where user=‘asdf' or 1=1 -- and pwd=''
執行後看到什嗎?是不是所有記錄,如果程式只是簡單判斷返回的條數,這種方法就可以通驗證。
如果執行語句是SA使用者,再通過xp_cmdshell添加系統管理員,那麼這個伺服器就被拿下了。
解決方案:
(1):這個問題主要是由於傳入特殊字元引起的我們可以在對輸入的使用者名稱密碼進入過濾特殊字元處理。
(2):使用預存程序通過傳入參數的方法可解決此類問題(注意:在預存程序中不可使用拼接實現,不然和沒用儲存過和是一樣的)。
2:XSS(跨站指令碼攻擊)
引起原因:
這個也有時被人們稱作HTML注入,和sql注入原理相似,也是沒有特殊字元進行處理。是使用者可以提交HTML標籤對網站進行重新的構造。其實在預設的情況下在asp.net網頁中是開啟validateRequest屬性的,所有HTML標籤後會.NET都會驗證:
但這樣直接把異常拋給使用者,多少使用者體驗就不好。
解決方案:
(1):通過在 Page 指令或 配置節中設定 validateRequest=false 禁用請求驗證,然後我們對使用者提交的資料進行HtmlEncode,編碼後的就不會出現這種問題了(ASP.NET 中編碼方法:Server.HtmlEncode(string))。
(2):第二種是過濾特殊字元,這種方法就不太提倡了,如果使用者想輸入小於符號( <)也會被過濾掉.
3:CSRF(跨網站請求偽造)
引起原因:
個人認為csrf在Ajax盛行的今天來說,倒是方便了,因為它可以在你不知道的情況用你的通過驗證使用者進行操作,所以也被稱為瀏覽器劫持。如果你已通過某個網站的驗證那麼你將以你的角色對網站進行操作,比如你是管理員可以添加其它的使用者到管理組,但是如果有人構造了添加管理員的連結被管理員點後也會執行相應操作.
解決方案:
在lake2的文章中也提出了。就是修改資訊時添加驗證碼。或添加Session令牌(ASP.NET中已經提供一個自動防範的方法,就是用頁面屬性ViewStateUserKey.在Page_Init方法中設定其值。this.ViewStateUserKey=Session.SessionID)。