[转载]ASP.NET MVC 最佳开发实践(3)

[转载]ASP.NET MVC 最佳开发实践(3) | EntLib.net 技术分享平台.

ASP.NET MVC 最佳开发实践(1)
ASP.NET MVC 最佳开发实践(2)

扩展建议 – Extensibility Recommendations

ASP.NET MVC 框架中有很多点可扩展,可替换任何核心组件,下面列举了部分:

  • routing engine (MvcRouteHandler)
  • controller factory (IControllerFactory)
  • view engine (IViewEngine)

例如,你可以重写自己的Controller factory,使用IoC容器。另外,你可通过添加定制的行为来扩展框架,在框架中有一些标准的过滤器(filter),如OutputCache、HandleError和Authorize等等。

使用过滤器来添加动作

MVC支持通过attribute添加动作(filter),可在action方法和action结果之前和之后。这些过滤器在请求处理管道允许进行轻量级扩展。

过滤器可应用在action方法上,更改其行为。另外,过滤器也可应用在controller类之上,对controller类中的所有 action方法生效。可使用基类base class定义通用的行为方法,并应用过滤器在基类controller上,接着确保其他controller继承该基类。

如你想增加一个功能,记录每一次请求信息,分析HTTP header的问题。如下代码定义了一个继承ActionFilterAttribute的类:

public class LogHeadersFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
foreach (string header in
filterContext.HttpContext.Request.Headers.AllKeys)
{
Debug.WriteLine("Header " + header);
Debug.WriteLine("Value " +
filterContext.HttpContext.Request.Headers.Get(header));
}
base.OnActionExecuting(filterContext);
}
}

为了添加给filter到指定的action方法,可简单将LogHeaderFilter属性添加到Action(或Controller)上面。

可测试性建议 – Testability Recommendations

MVC模式的一个主要优点是加强可测试性,保持关注点分离。在ASP.NET MVC 应用程序的Model中,可清晰分离和测试业务逻辑。如你可测试向拍卖网站增加一条拍卖纪录,不必依赖Controller或View。

编写单元测试

ASP.NET MVC 提供了很多工具,开发人员可用来创建可测试的应用程序。此外,也相当比较简单添加第三方的单元测试框架、Mocking框架、或依赖注入容器。ASP.NET MVC 提供了灵活的架构方便单元测试。

安全建议 – Security Recommendations

安全是现代软件开发项目中一个很重要的方面。尽管没有框架提供完美的安全,但有很多地方可做,来保护ASP.NET MVC 应用程序。

安全保护以防攻击

网站安全需要考虑所有web开发人员编写的企业级网站和服务,有许多众所周知的工具,如下所示:

  • Cross-site scripting (XSS) attacks
  • SQL injection
  • Cross-site Request Forgery (XSRF)
  • Improperly implementing model binding

(1) 阻止跨站攻击(XSS):

  • 使用ValidateInput 属性禁止无效的请求;
  • 在所有显示用户输入数据的地方使用Html.Encode,不管是立即呈现或数据将存入数据库,然后显示;
  • 在Cookies上设置HttpOnly标识,阻止JavaScript读取和发送Cookies;

(2) 阻止SQL注入攻击:

  • 总是使用参数化SQL查询;
  • 不要传递未经检验的SQL脚本到数据库;
  • 使用ORM工具,如Entity Framework,可完全消除在应用程序代码中编写SQL语句;

(3) 阻止跨站请求伪造攻击:

  • 在表单中使用Html.AntiForgeryToken 类阻止跨站伪造情况。在接收post请求的Action方法上设置ValidateAntiForgeryToken 属性;

(4) 正确实现model binding:

  • 显式指定模型绑定的类成员名称,如[Bind(Include=显式属性名称)];
  • 还可创建视图模型(View model),用来接收外部表单输入,视图模型仅包含外部输入的属性;

对用户进行验证和授权保护内容

对于受限的数据视图,通过编写自定义的RoleProvider,或使用Authorize 过滤器属性。

使用<%: %> (.NET 4) 保护,以防XSS攻击

在.NET 4.0 之前,开发人员通过使用如下代码,来确保编码HTML:

<%= Html.Encode(ViewData[“name”]) %>

上述代码以防 XSS (cross-site scripting) 攻击。

如果你使用.NET 4,可不必使用上面的语法,简化语法如下:

<%: ViewData[“name”] %>

该脚本会自动对字符串进行HTML编码(如有必要)。

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏