asp.net MVC 常见安全问题及解决方案
一.CSRF (Cross-site request forgery跨站請求偽造,也被稱為“one click attack”或者session riding,通??s寫為CSRF或者XSRF,是一種對網(wǎng)站的惡意利用)
詳細說明: http://imroot.diandian.com/post/2010-11-21/40031442584
Example : 在登陸狀態(tài)下進入了攻擊網(wǎng)站向安全站點發(fā)送了請求。
Solution: 在view 中使用 @Html.AntiForgeryToken(), 在Action 上加上 [ValidateAntiForgeryToken] 特性。 再次點到跨域請求的時候就會顯示 :
“The required anti-forgery cookie "__RequestVerificationToken" is not present.”
二.XSS (XSS攻擊:跨站腳本攻擊(Cross Site Scripting),為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆。故將跨站腳本攻擊縮寫為XSS。)
Solution: 分為 Html ,js ,url 三大領(lǐng)域。 需要區(qū)別對待進行輸入輸出編碼。
Html 使用 Server.HtmlEncode , Server.HtmlDecode;
url使用 Server.urlEncode, Server.urlDecode;
js 使用: escape, unescape;
或者使用 Anti-XSS 庫。 下載地址 :
http://www.microsoft.com/en-us/download/details.aspx?id=28589
引入后,html ,js ,url 分別對應(yīng)的方法 HtmlEncode(string),JavaScriptEncodes(string),UrlEncode(string).
三.直接對象引用
Example: …/Bidding/RFPRFI/Detail?editId=xxx??梢灾苯涌吹狡渌镜男畔?;
bidding-> evaluation .
應(yīng)標(biāo)方可直接在地址欄中輸入:…/Bidding/Evaluation/SaveScope?proposalId=1603&priceScope=100&proScore=100&chs=100。
來隨意修改評分。
還有MDI 系統(tǒng)中的下拉框是easyui綁定一個隱藏域兩部分。 甚至可以使用瀏覽器的調(diào)試工具, 直接修改hidden 域的值后提交。
Solution: 加入驗證。 例如 : select * from rfprfi where edited = xxx and
owner = currentuser.userid.
驗證該用戶對此信息是否有讀寫的權(quán)限。(具體要根據(jù)業(yè)務(wù)邏輯一一處理,這個工作量十分大。建議后期完成)。
四.DOS
Solution:可使用HTTPModule阻止訪問率太高的ip。 example code 見我的博客:
http://www.2cto.com/kf/201307/226466.html
這種方式是針對固定IP發(fā)起的DOS攻擊來的。 如果攻擊方使用了代理IP,則需要考慮用其他方式。 關(guān)于這一點后續(xù)會作補充。
五.傳輸層未做保護
Example: 登陸系統(tǒng)的post請求中將account , loginname , password 信息都是明文傳輸。
Solution: 使用HTTPS。(需要付費)。
六.暴力破解密碼
目前的登陸和修改密碼,沒有錯誤次數(shù)的限制。
Solution: 是否可以加入新的邏輯:單位時間內(nèi)輸入錯誤次數(shù)大于一個數(shù)值時,改賬號會被凍結(jié)。可以由改company的admin 解凍 或者發(fā)送申請到 sunnet后由sunnet公司解凍。
七.?dāng)?shù)據(jù)加密
目前登陸密碼是用DES加密的。 一般登陸用的密碼都是用單向的加密,比如MD5。而例如Invoice number ,pipeline 的位置信息,都用DES加密后存入數(shù)據(jù)庫。
八.身份驗證
問題:目前是使用了session認證。如果被會話劫持或者會話冒充。則失去了認證機制。
Solution:使用多重保險。
1.使用form認證:目前配置文件中已加入form認證的節(jié)點,<forms loginUrl="~/Account/Login" timeout="2880"/>
但是code中并沒有使用。需要再登陸成功后加入
System.Web.Security.FormsAuthentication.SetAuthCookie登出后加入
System.Web.Security.FormsAuthentication.SignOut,在basecontrol 中再加上一層
User.Identity.IsAuthenticated的判斷即可。
2.使用membership 與FormsAuthentication 一起創(chuàng)建身份驗證。
3.是否考慮使用WCF 來完善驗證機制。
4.Passport 驗證。(由微軟提供,需要收費。。)
九.錯誤處理
問題:為了安全起見,應(yīng)該假設(shè)在某些時候會發(fā)生一個沒有捕獲的異常。
Solution: 1.重寫 Controller 的 OnException方法:
1
2
3
4
5
|
protected override void OnException(ExceptionContext filterContext)
{
filterContext.ExceptionHandled =true;
this.View("").ExecuteResult(filterContext.Controller.ControllerContext);
}
|
2. 或者通過 HandleError特性來實現(xiàn)一個或多個異常處理器。特別是比如invoice paid之類的重要操作,需要更細粒度的錯誤處理
十.CAS 權(quán)限
目前沒有控制代碼訪問安全。
Solution:
1.
使用具體的權(quán)限類實現(xiàn)標(biāo)準(zhǔn)的方法:
比如需要嚴格控制文件的讀權(quán)限。
1
2
3
4
5
6
7
8
9
10
|
FileIOPermission iopermission =new FileIOPermission(FileIOPermissionAccess.Read,"xx.txt");
try
{
iopermission.Demand();
//實現(xiàn)方法
}
catch(SecurityException ex)
{
//處理異常
}
|
或者使用相關(guān)聯(lián)的特性:
[FileIOPermission(SecurityAction.Demand,Read =”xx.txt”)]
2.那些需要Full Trust 的代碼放到 GAC單獨的程序集中存儲。因為GAC中的代碼全部在Full Trust
下運行的。添加方式可以通過命令提示符 –sn 或者通過工具完成。添加完成后就可以在主程序中添加引用,并且需要添加
AllowPartiallyTrustedCallers 特性以得到訪問權(quán)限