zoukankan      html  css  js  c++  java
  • ASP.NET MVC 3 高级编程 读书笔记

     

    第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委托
    • 运行时可编辑的路由
    • 使用异步控制器操作

     

     

    书已读完。

  • 相关阅读:
    17_8_30 Mybatis 入门
    17_8_29 mysql 导入导出备份还原
    [iOS基础控件
    [iOS基础控件
    [iOS基础控件
    [MAC OSX
    [iOS基础控件
    [iOS基础控件
    [iOS基础控件
    [iOS基础控件
  • 原文地址:https://www.cnblogs.com/MikeYao/p/2611621.html
Copyright © 2011-2022 走看看