ASP.NET MVC 3 進階編程 – 讀書筆記

來源:互聯網
上載者:User

 

第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)集合中來挖取請求中的值。

一般模型繫結會隱式地工作。但也可以使用控制器中的UpdateModelTryUpdateModel方法顯式地調用模型繫結。

 

第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效能,可用:

  1. Firebug的YSlow(參見http://developer.yahoo.com/yslow/)
  2. IE的開發人員工具(參見http://msdn.microsoft.com/zh-cn/library/dd565629%28v=vs.85%29.aspx)
  3. 使用內容分髮網絡CDN(Content Delivery Network)。CDN在世界各地都有邊緣緩衝(edge-cached)伺服器,因此用戶端很有可能體驗到更快的下載。微軟提供的CDN可登入 http://www.asp.net/ajaxlibrary/CDN.ashx 查看最新版本。
  4. 所有的script標籤都放在頁面的底部就會產生很好的使用者體驗。
  5. 微軟提供了強大的JavaScript瘦身工具: http://ajaxmin.codeplex.com/
  6. 另一種最佳化指令碼的技術是減少向用戶端發送的script標籤數量。對於任何頁面而言,瀏覽器看到script標籤的最優數量是一個。可使用指令碼合并器將多個JavaScript檔案捆綁成一個資源檔。推薦一個:http://combres.codeplex.com/

 

第9章 路由機制

使用StopRoutingHandler是一種確保路由機制忽略某種請求的方法。

此外,還有一種更簡單的方法來使路由機制忽略一個路由,即IgnoreRoute

 

需要記住的一點是:路由機制在選擇匹配的路由時並不是精確地匹配。它只是選擇足夠匹配的路由。換言之,只要指定的參數滿足路由的需要,是否指定額外參數則無關緊要。

 

第12章 單元測試

在一個測試中,一定不要同時測試多個行為。一個好的單元測試程式通常只測試一個非常小的功能,即一個單一行為。

一些開發人員稱這一規則為單一斷言規則(single assertion rule)。不要誤以為我們的測試程式只能調用一次斷言,其實,我們只要記得一次只測試一個行為,而驗證一個合乎邏輯的行為調用多次Assert經常是必要的。

 

第14章 進階主題

這章有很多有意思的主題:

  • 模板化的Razor委託
  • 運行時可編輯的路由
  • 使用非同步控制器操作

 

 

書已讀完。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.