第1章 入門
約定優於配置:
- 每一個Controller類的名字以Controller結束——如HomeController,這些類在Controllers目錄中。
- 控制器使用的視圖是在Views主目錄的一個子目錄中,這個子目錄是根據控制器名稱(後面減去Controller的尾碼)來命名的。
- 在每一個控制器的View檔案夾中,每一個操作方法都有一個名稱相同的視圖檔案與之對應。
第2章 控制器
URL不是與儲存在Web伺服器的硬碟上的檔案有直接對應關係,而是與控制器類的一個方法有關。
理解MVC模式在Web情境中工作原理的一個好方法就是記住:MVC提供的是方法調用的結果,而不是動態產生的(又名指令碼)頁面。
利用實用方法 HttpUtility.HtmlEncode 來預先處理使用者輸入。這能阻止使用者向視圖中用連結注入 JavaScript 代碼或 HTML 標籤。
第3章 視圖
在一些情形下,甚至需要指定完全位於不同目錄結構中的視圖。這樣可以使用帶有~符號的文法來提供視圖的完整路徑。這時,必須提供視圖的副檔名。
在Controller方法中,可以通過向重載的View方法中傳遞模型執行個體來指定模型。
public ActionResult List() { var albums = new List<Album>(); for (int i = 0; i < 10; i++) { albums.Add(new Album {Title = "Album " + i}); } return View(albums);}
在後台,傳進View方法的值將賦給ViewData.Model屬性。接下來是告知視圖哪種類型的模型正在使用@model聲明。
@model IEnumerable<MvcApplication1.Models.Album><ul>@foreach (Album p in Model) { <li>@p.Title</li>}</ul>
為了消除Razor帶來的潛在二義性,可將運算式用圓括弧括起來。
可以用兩個@@符號轉義一個@符號。
當在JavaScript中將使用者提供的值賦給變數時,要使用JavaScript字串編碼而不僅僅是HTML編碼,記住這一點很重要。也就是要使用@Ajax.JavaScriptStringEncode方法對使用者輸入進行編碼,有效避免XSS攻擊。
3.6.5節是Razor文法樣本,有9個細節點,P52。
第4章 模型
ASP.NET MVC的一個核心特性是模型繫結,它使我們不用從整個表單(form)集合中來挖取請求中的值。
一般模型繫結會隱式地工作。但也可以使用控制器中的UpdateModel和TryUpdateModel方法顯式地調用模型繫結。
第5章 表單和HTML輔助方法
因為class是C#語言中的一個保留關鍵字,不能用作屬性名稱或標識符,所以必須在class前面加一個@符號作為首碼。
帶有連字號的C#屬性名稱是無效的,但所有的HTML輔助方法在渲染HTML時會將屬性名稱中的底線轉換為連字號。
強型別的輔助方法名稱有“For”尾碼,只需要為它傳遞一個lambda運算式來指定要渲染的模型屬性即可。
第7章 應用程式的安全性
請記住這些錦囊妙語:
- 永遠都不要相信使用者提供的任何資料。其中包括所有的表單值、URL、cookie或來自第三方源的個人資訊。還有,網站所訪問的資料庫或服務可能沒有對這些資料進行編碼,所以不要相信輸入應用程式的任何資料,要儘可能地對它們進行編碼。
- 每當渲染作為使用者輸入而引入的資料時,請對其進行HTML編碼(如果資料作為特性值顯示,就應對其進行HTML特性編碼HTML-attribute-encode)。
- 考慮好網站的哪些部分允許匿名訪問,哪些部分要求認證訪問。
- 不要試圖自己淨化使用者的HTML輸入(使用白名單或其他方法)——否則將遭遇失敗。
- 在不需要通過用戶端指令碼訪問cookie時,使用HTTP-only cookie。
- 強烈建議使用AntiXSS庫(www.codeplex.com/AntiXSS)。
阻止XSS攻擊
解決XSS中JavaScript編碼攻擊有2種解決辦法:1.嚴密的方法是使用Ajax.JavaScriptStringEncode輔助函數對JavaScript中使用的字串進行編碼。2.比較徹底,使用AntiXSS庫。
阻止CSRF攻擊
1.令牌驗證。最簡單的方式是,在每個表單請求中插入一個包含唯一值的隱藏輸入元素。
頁面加 @Html.AntiForgeryToken()
方法加屬性 [ValidateAntiforgeryToken]
2.等冪的GET請求。
3.HttpReferrer驗證。即驗證AuthorizationContext的執行個體.HttpContext.Request.UrlReferrer.Host。
使用HttpOnly阻止cookie盜竊
事實上,可以停止指令碼對網站中cookie的訪問,只需要設定:HttpOnly。在web.config或單獨的cookie設定。這個標誌告訴瀏覽器,除了伺服器修改或設定cookie之外,其他一些對cookie的操作均無效。儘管它很簡單,但它卻可以阻止大部分基於XSS的cookie問題。
使用Bind特性防禦重複提交(over-posting)攻擊
防禦重複提交攻擊的最簡單方法就是使用[Bind]特性顯式地控制需要由模型繫結器綁定的屬性。Bind特性既可以放在模型類上,也可以放在控制器巨集指令引數中。可以使用白名單或黑名單的方式。
重新導向攻擊防禦可以調用位於System.Web.Mvc.Url輔助類下名為IsLocalUrl()的新方法來驗證returnUrl參數。
使用Retail部署配置
將web.config -> system.web -> deployment/retail設定為true,將會影響以下幾項設定:
- customErrors模式被設定為On,也就是最安全的設定。
- 禁用跟蹤輸出。
- 禁用調試。
小結
威脅 |
解決方案 |
自滿 |
自我訓練 假設應用程式將被駭客攻擊 記住:保護好自己的資料最重要 |
跨站指令碼攻擊(XSS) |
使用HTML編碼所有內容 編碼特性 記住JavaScript編碼 如果可能的話,使用AntiXSS類 |
跨站請求偽造(CSRF) |
令牌驗證 等冪的GET請求 HttpReferrer驗證 |
重複提交 |
使用Bind特性顯式地綁定白名單或者拒絕黑名單 |
第8章 AJAX
非侵入式JavaScript的顯著特點是在HTML中不包含任何JavaScript代碼。但可以在HTML元素中增加有data-首碼的特性,我們稱之為 data- 特性。Web瀏覽器不會嘗試解釋data-特性的內容,包括IE 6。
提高AJAX效能,可用:
- Firebug的YSlow(參見http://developer.yahoo.com/yslow/)
- IE的開發人員工具(參見http://msdn.microsoft.com/zh-cn/library/dd565629%28v=vs.85%29.aspx)
- 使用內容分髮網絡CDN(Content Delivery Network)。CDN在世界各地都有邊緣緩衝(edge-cached)伺服器,因此用戶端很有可能體驗到更快的下載。微軟提供的CDN可登入 http://www.asp.net/ajaxlibrary/CDN.ashx 查看最新版本。
- 所有的script標籤都放在頁面的底部就會產生很好的使用者體驗。
- 微軟提供了強大的JavaScript瘦身工具: http://ajaxmin.codeplex.com/
- 另一種最佳化指令碼的技術是減少向用戶端發送的script標籤數量。對於任何頁面而言,瀏覽器看到script標籤的最優數量是一個。可使用指令碼合并器將多個JavaScript檔案捆綁成一個資源檔。推薦一個:http://combres.codeplex.com/
第9章 路由機制
使用StopRoutingHandler是一種確保路由機制忽略某種請求的方法。
此外,還有一種更簡單的方法來使路由機制忽略一個路由,即IgnoreRoute。
需要記住的一點是:路由機制在選擇匹配的路由時並不是精確地匹配。它只是選擇足夠匹配的路由。換言之,只要指定的參數滿足路由的需要,是否指定額外參數則無關緊要。
第12章 單元測試
在一個測試中,一定不要同時測試多個行為。一個好的單元測試程式通常只測試一個非常小的功能,即一個單一行為。
一些開發人員稱這一規則為單一斷言規則(single assertion rule)。不要誤以為我們的測試程式只能調用一次斷言,其實,我們只要記得一次只測試一個行為,而驗證一個合乎邏輯的行為調用多次Assert經常是必要的。
第14章 進階主題
這章有很多有意思的主題:
- 模板化的Razor委託
- 運行時可編輯的路由
- 使用非同步控制器操作
書已讀完。