第1章 入门
约定优于配置:
第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章 应用程序的安全性
请记住这些锦囊妙语:
阻止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,将会影响以下几项设置:
小结
威胁 |
解决方法 |
自满 |
自我训练 假设应用程序将被黑客攻击 记住:保护好自己的数据最重要 |
跨站脚本攻击(XSS) |
使用HTML编码所有内容 编码特性 记住JavaScript编码 如果可能的话,使用AntiXSS类 |
跨站请求伪造(CSRF) |
令牌验证 幂等的GET请求 HttpReferrer验证 |
重复提交 |
使用Bind特性显式地绑定白名单或者拒绝黑名单 |
第8章 AJAX
非侵入式JavaScript的显著特点是在HTML中不包含任何JavaScript代码。但可以在HTML元素中增加有data-前缀的特性,我们称之为 data- 特性。Web浏览器不会尝试解释data-特性的内容,包括IE 6。
提高AJAX性能,可用:
第9章 路由机制
使用StopRoutingHandler是一种确保路由机制忽略某种请求的方法。
此外,还有一种更简单的方法来使路由机制忽略一个路由,即IgnoreRoute。
需要记住的一点是:路由机制在选择匹配的路由时并不是精确地匹配。它只是选择足够匹配的路由。换言之,只要指定的参数满足路由的需要,是否指定额外参数则无关紧要。
第12章 单元测试
在一个测试中,一定不要同时测试多个行为。一个好的单元测试程序通常只测试一个非常小的功能,即一个单一行为。
一些开发人员称这一规则为单一断言规则(single assertion rule)。不要误以为我们的测试程序只能调用一次断言,其实,我们只要记得一次只测试一个行为,而验证一个合乎逻辑的行为调用多次Assert经常是必要的。
第14章 高级主题
这章有很多有意思的主题:
书已读完。