ASP.NET MVC: 使用 Filters 附加 过滤敏感信息 功能

看本文,需要对以下技术有所了解:

  1. AOP
  2. ASP.NET MVC

ASP.NET MVC Filters 简介

ASP.NET Filters:ASP.NET MVC 中加在 Controller 或 Action 上的一种 Attribute。 通过它,MVC 网站在处理用户请求时,可以处理一些附加的操作,如:用户权限验证、系统日志、异常处理、缓存等。使用Filters可以使用简洁、强大的方式实现 AOP,Filter 中定义的行为可以在网站中多处简单方便的复用。

ASP.NET MVC 中包含以下四种Filter:

  1. Authorization filter
  2. Action filter
  3. Result filter
  4. Exception filter

本文只使用Action filter。

Action filter:

创建 Action filter 必须实现 IActionFilter 接口,它定义了两个方法:

方法名 调用时机可进行的操作
OnActionExecutingAction方法执行之前可以给 filterContext.Result 赋值,以阻止 Action 的执行
可以通过 filterContext.ActionParameters 查看或修改 Action 的参数
OnActionExecutedAction方法执行之后可以通过 filterContext.Exception 获取 Action 执行时抛出的异常,并能把它标记为“已处理”:filterContext.ExceptionHandled = true。
可以查看通过filterContext.Result查看 Action 的执行结果,但是不能修改。

下面就使用 OnActionExecuting 可以在 Action 方法执行前 能查看并修改参数值的特性 来完成敏感信息的过滤功能。

过滤敏感信息

过滤敏感信息对一个网站来说非常重要,没有一个站长愿意看到自己网站因为一些敏感信息而被封。

然而过滤敏感信息也不是一件容易事:

  1. 需要一个好的过滤算法:简单的字符替换容易误伤,大多算法要用到正则表达式,档次高的还会用的语义分析;
  2. 需要对很多地方过滤:网站大了,接收用户输入的地方很多,每个地方都要进行围堵。

本仍不介绍过滤算法,只解决第二个问题。

使用 Filters 附加过滤敏感信息功能

创建SensitiveWordsFilterAttribute:

新建一个类SensitiveWordsFilterAttribute,从ActionFilterAttribute继承,重写OnActionExecuting方法: 

 
  
     public   class  SensitiveWordsFilterAttribute: ActionFilterAttribute     {          public   override   void  OnActionExecuting(ActionExecutingContext filterContext)         {             var parameters  =  filterContext.ActionDescriptor.GetParameters();              foreach  (var parameter  in  parameters)             {                  if  (parameter.ParameterType  ==   typeof ( string ))                 {                      // 获取字符串参数原值                     var orginalValue  =  filterContext.ActionParameters[parameter.ParameterName]  as   string ;                      // 使用过滤算法处理字符串                     var filteredValue  =  SensitiveWordsFilter.Instance.Filter(orginalValue);                      // 将处理后值赋给参数                     filterContext.ActionParameters[parameter.ParameterName]  =  filteredValue;                 }             }         }     }

上面的例子中,我们通过 filterContext.ActionDescriptor.GetParameters() 方法能获取到所有参数的详细信息。

通过 filterContext.ActionParameters 可以获取和设置参数的值。

附加过滤功能:

我们只需要将SensitiveWordsFilterAttribute标在 Controller 或 Action 上:

 
  
    [SensitiveWordsFilter]      public   class  ArticlesController : Controller     {          // ...     }

过滤好比抗洪,要全面围堵,遗漏任何一个地方,都将是灾难性的。如果懒的去一一查找要进行过滤的 Action,不如对所有的 Controller 都进行处理(有点"宁错杀,勿放过"的感觉),可采用以下方法之一:

  1. 每个 Controller 逐一添加SensitiveWordsFilterAttribute;
  2. 让所有 Controller 都从一个 Controller 基类继承,只需要给这个 Controller 基类加上SensitiveWordsFilterAttribute;
  3. 如果你开始尝鲜使用 ASP.NET MVC 3,那就更简单了,只需要在 Global.asax 文件中处理:
     
        
        protected   void  Application_Start()
    {       // ...      RegisterGlobalFilters(GlobalFilters.Filters); } protected   void  RegisterGlobalFilters(GlobalFilterCollection filters) {     filters.Add( new  SensitiveWordsFilterAttribute()); }

补充说明

实际情况要复杂的多,比如需要将过滤情况反馈给用户,提示哪儿出了问题,高度显示敏感词等。这些都可以通过 Filter 简单实现。

参考

《Pro ASP.NET MVC 2 Framework.pdf》

Introducing ASP.NET MVC 3 (Preview 1)

后记

本文中代码存在一处非常严重的漏洞,请参见我的新随笔《ASP.NET MVC: 使用自定义 ModelBinder 过滤敏感信息》

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值