asp.net MVC 常見安全問題及解決方案


asp.net MVC 常見安全問題及解決方案
一.CSRF (Cross-site request forgery跨站請求偽造,也被稱為“one click attack”或者session riding,通常縮寫為CSRF或者XSRF,是一種對網站的惡意利用)
詳細說明 http://imroot.diandian.com/post/2010-11-21/40031442584
 
Example :            在登陸狀態下進入了攻擊網站向安全站點發送了請求。
 
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 三大領域。 需要區別對待進行輸入輸出編碼。
 
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 分別對應的方法 HtmlEncode(string),JavaScriptEncodes(string),UrlEncode(string).
 
 
 
三.直接對象引用
 
Example:  …/Bidding/RFPRFI/Detail?editId=xxx。可以直接看到其他公司的信息;
 
bidding-> evaluation . 應標方可直接在地址欄中輸入:…/Bidding/Evaluation/SaveScope?proposalId=1603&priceScope=100&proScore=100&chs=100。 來隨意修改評分。
 
還有MDI 系統中的下拉框是easyui綁定一個隱藏域兩部分。 甚至可以使用 瀏覽器的調試工具, 直接修改hidden 域的值后提交。
 
Solution: 加入驗證。 例如 : select * from rfprfi where edited = xxx and owner = currentuser.userid. 驗證該用戶對此信息是否有讀寫的權限。(具體要根據業務邏輯一一處理,這個工作量十分大。建議后期完成)。
 
 
四.DOS
 
Solution:可使用HTTPModule阻止訪問率太高的ip。 example code 見我的博客:
 
http://www.2cto.com/kf/201307/226466.html
 
這種方式是針對固定IP發起的DOS攻擊來的。 如果攻擊方使用了代理IP,則需要考慮用其他方式。 關於這一點后續會作補充。 
 
 
五.傳輸層未做保護
 
Example: 登陸系統的post請求中將account , loginname , password 信息都是明文傳輸。
 
Solution: 使用HTTPS。(需要付費)。
 
 
六.暴力破解密碼
 
目前的登陸和修改密碼,沒有錯誤次數的限制。
 
Solution: 是否可以加入新的邏輯:單位時間內輸入錯誤次數大於一個數值時,改賬號會被凍結。可以由改company的admin 解凍 或者發送申請到 sunnet后由sunnet公司解凍。
 
 
七.數據加密
 
目前登陸密碼是用DES加密的。 一般登陸用的密碼都是用單向的加密,比如MD5。而例如Invoice number ,pipeline 的位置信息,都用DES加密后存入 數據庫
 
 
 
八.身份驗證
 
問題:目前是使用了session認證。如果被會話劫持或者會話冒充。則失去了認證機制。
 
Solution:使用多重保險。
1.使用form認證:目前配置文件中已加入form認證的節點,<forms loginUrl="~/Account/Login" timeout="2880"/>
但是code中並沒有使用。需要再登陸成功后加入 System.Web.Security.FormsAuthentication.SetAuthCookie登出后加入 System.Web.Security.FormsAuthentication.SignOut,在basecontrol 中再加上一層 User.Identity.IsAuthenticated的判斷即可。
 
2.使用membership 與FormsAuthentication 一起創建身份驗證。
 
3.是否考慮使用WCF 來完善驗證機制。
 
4.Passport 驗證。(由微軟提供,需要收費。。)
 
 
 
九.錯誤處理
 
問題:為了安全起見,應該假設在某些時候會發生一個沒有捕獲的異常。
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特性來實現一個或多個異常處理器。特別是比如invoice paid之類的重要操作,需要更細粒度的錯誤處理
 
 
 
十.CAS 權限
 
目前沒有控制代碼訪問安全。
 
Solution:
 
1.
 
使用具體的權限類實現標准的方法:
 
比如需要嚴格控制文件的讀權限。

?
1
2
3
4
5
6
7
8
9
10
FileIOPermission iopermission = new FileIOPermission(FileIOPermissionAccess.Read, "xx.txt" );
try
{
iopermission.Demand();
//實現方法
}
catch (SecurityException ex)
{
//處理異常
}

 

或者使用相關聯的特性:
[FileIOPermission(SecurityAction.Demand,Read =”xx.txt”)]
2.那些需要Full Trust 的代碼放到 GAC單獨的程序集中存儲。因為GAC中的代碼全部在Full Trust 下運行的。添加方式可以通過命令提示符 –sn 或者通過工具完成。添加完成后就可以在主程序中添加引用,並且需要添加 AllowPartiallyTrustedCallers 特性以得到訪問權限


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM