1. 安全性:无趣但重要
永远都不要相信客户提供的任何数据。
举例:
- 对用户数据的数据进行编码,如果作为特性值显示,进行HTML编码;如用于JavaScript代码段,进行JavasCript编码;也可进行多层的编码,如HTML页面的JavaScript编码;
- 对于网站,需要考虑哪些页面允许匿名访问,哪些页面需要认证访问;
- 在不需要通过客户脚本(大部分情况下)访问Cookie时,使用HTTP-only cookie;
- 外部输入的内容包括:显式表单、URL查询字符串、影藏表单域、Ajax请求以及外部服务结果;
- 建议使用AntiXSS编码器(ASP.NET4.5以后版本自带的MS Web Protection Library的一个组件)
2. 使用Authorize特性
Authorize控制器过滤器用于设置应用程序的访问部分,也可以用于全局操作过滤器使用。
如何禁用匿名访问,例如在Buy控制器上,添加Authorize特性
[Authorize] public ActionResult Buy(int id) { var album = GetAlbums().Single(a => a.AlbumId == id); //Charge the user and ship the album!!! return View(album); }
Authorize特性首先执行OnAuthorization方法,该方法是IAuthorizationFilter中定义的。源代码如下
IPrincipal user = httpContext.User; If(!user.Identity.IsAuthonticated){ return false; } if(_userSplit.Length > 0 && !_userSplit.Contains(user.Identity.Name, StringComparer.OrdinalIgnoreCase)){ return false; } if(_userSplit.Length > 0 && !_rolesSplit.Any(user.IsInRole)){ return false; } return true;
安全机制验证ASP.NET上下文httpContext.User中存储的身份信息。
Authoritize作为过滤器先于控制器操作执行,如果验证失败,返回HTTP401(未授权)的状态码。这个401状态码不友好,一般用HTTP302重定向到登录界面。
MVC5中的重定向设定:401到302重定向的转换过程由OWIN(Open Web Interface for .NET)中间件处理;基于Cookie的身份认证由CookieAuthencationHandler(包含在Microsoft.Owin.Cookies名称空间中)处理。
ASP.NET先前版本的处理:这个重定向由FormsAuthenticationModule 的OnLeave方法截获,重定向到Web.Config文件定义的登录界面,代码如下:
<authentication mode="Forms"> <forms loginUrl="~/Account/LogOn" timeout="2880"> </authentication>
但是,开放重定向功能容易成为被攻击的对象,攻击者可以注入恶意的URL将用户重定向到有害的网站,避免的方法接下章节将会介绍,本节不再叙述。
3. 使用全局过滤器保证应用程序的安全
对大部分网站来说,基本上整个应用程序都需要授权访问,默认授权和匿名访问极少数页面(如主页和相关页面),可以将AuthorizeAttribute配置为全局过滤器。
将以下代码添加到RegisterGlobalFilters(\App_Start\FilterConfig.cs文件中),将AuthorizeAttribute应用于应用程序的所有控制器当中。
public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new System.Web.Mvc.AuthorizeAttribute()); filters.Add(new HandleErrorAttribute()); }
应用实例(已完成上述操作):
[AllowAnoymous]public ActionResult LogIn(String returnUrl) { ViewBag.ReturnRul = returnUrl; return View(); }
在对应用程序所有的Control设定全局过滤器后,在方法上添加AllowAnoymous特性,实现外部的匿名访问登录页面。需要注意的是,AllowAnoymous特性只对标准的AuthoriseAttribute特性有效,对于自定义的过滤器不一定有效(MVC5 允许用户自定义过滤器、全局过滤器只针对MVC控制器操作有效,不能保障Web Forms 和静态内容或其他ASP.NET处理程序,该内容的实现方法由 web.config文件中的authorization元素保证)。