在开发过程中,有时候会对用户输入进行过滤,以便保证平台的安全性。屏蔽的方法有很多种,但是今天我说的这种主要是利用MVC中的ActionFilterAttribute属性来实现。由于MVC天然支持AOP,所以我们这种过滤方式正好利用了MVC的这种特性。

下面请看步骤:

首先,当用户输入自己的名称的时候,带有类似<BR>的内容的时候,由于MVC默认是需要验证内容的,所以,会抛出一张黄页错误,提示用户:从客户端检测到潜在风险的Request值。这种页面是极为不友好的,同时也是我们作为开发最不想见到的页面,屏蔽这个错误很简单,就是在响应的页面ActionResult上面加上[ValidateInput(false)]的特性,这样当用户提交的时候,页面将不会再次对输入内容做检测。

如果容忍这样的行为,将会对系统的安全性造成威胁,所以最好的解决方法就是讲其中类似 <>等进行转义。

下面我们就来利用ActionFilterAttribute构造自己的转义过滤类:

   1:  using System.Web.Mvc;
   2:  using TinyFrame.Plugin.StrongTyped.Models;
   3:   
   4:  namespace TinyFrame.Plugin.StrongTyped
   5:  {
   6:      public class FilterCharsAttribute : ActionFilterAttribute
   7:      {
   8:          protected string parameterName = "t";
   9:          protected TestModel model;
  10:   
  11:          public override void OnActionExecuting(ActionExecutingContext filterContext)
  12:          {
  13:              base.OnActionExecuting(filterContext);
  14:   
  15:              //No Parameters, will return directly.
  16:              if (!filterContext.ActionParameters.ContainsKey(parameterName))
  17:                  return;
  18:   
  19:              var t = filterContext.ActionParameters[parameterName] as TestModel;
  20:   
  21:              //No Entity data, will return directly
  22:              if (t == null)
  23:                  return;
  24:   
  25:              //Replace chars that should be filtered
  26:              if (!string.IsNullOrEmpty(t.TName))
  27:                  t.TName = t.TName.Replace("<", "&lt").Replace(">", "&gt");
  28:              if (!string.IsNullOrEmpty(t.TSite))
  29:                  t.TSite = t.TSite.Replace("<", "&lt").Replace(">", "&gt");
  30:          }
  31:      }
  32:  }

第8行,代表我们的用户输入的实体类参数,具体的Controller代码如下:

   1:    public ActionResult Index(TestModel t)
   2:          {
   3:              ViewData["ConvertedModel"] = t;
   4:              return View();
   5:          }

第11行,通过重载OnActionExecuting方法,我们可以定义自己的Filter。

第19行,将获取的Input结果转换成entity。

第27,29行,将潜在的危险字符进行转义。

这样书写完毕之后,我们就打造了一个可以过滤掉关键字的Filter了。如果想要做的通用的话,需要对输入的filterContext.ActionParameters进行遍历,并通过反射构建实例,再通过反射字段值,实现通用的关键字过滤。这里我只提供思路,具体的做法就看自己了。

然后将这个方法加入到Controller中需要检测的页面的头部,即可:

   1:  [ValidateInput(false)]
   2:  [FilterChars]
   3:  public ActionResult Index(TestModel t)
   4:  {
   5:       ViewData["ConvertedModel"] = t;
   6:       return View();
   7:  }

这样,我们就完成了对输入数据的过滤操作,下面看看结果吧:

我们可以清楚的看到,输入结果,输出后,一对尖角号被转义了。

MVC中利用ActionFilterAttribute过滤关键字的更多相关文章

  1. MVC中利用自定义的ModelBinder过滤关键字

    上一篇主要讲解了如何利用ActionFilter过滤关键字,这篇主要讲解如何利用自己打造的ModelBinder来过滤关键字. 首先,我们还是利用上一篇中的实体类,但是我们需要加上DataType特性 ...

  2. Asp.net Mvc中利用ValidationAttribute实现xss过滤

    在网站开发中,需要注意的一个问题就是防范XSS攻击,Asp.net mvc中已经自动为我们提供了这个功能.用户提交数据时时,在生成Action参数的过程中asp.net会对用户提交的数据进行验证,一旦 ...

  3. asp.net mvc 5 利用ActionFilterAttribute实现权限过滤

    关于c#属性的教程:http://www.runoob.com/csharp/csharp-attribute.html 在asp.net mvc5中,可以利用ActionFilterAttribut ...

  4. ASP.NET MVC中利用AuthorizeAttribute实现访问身份是否合法以及Cookie过期问题的处理

    话说来到上海已经快半年了,时光如白驹过隙,稍微不注意,时间就溜走了,倒是没有那么忙碌,闲暇之际来博客园还是比较多的,记得上次在逛博问的时候看到有同志在问MVC中Cookie过期后如何作相关处理,他在阐 ...

  5. MVC中利用knockout.js实现动态uniqueId

    题目比较拗口,但是这篇文章确实直说这一点. knockout.js是一个JS库,它的官网是http://knockoutjs.com/ 这篇文章的重点是knockout在工作的一个功能中的应用.最终效 ...

  6. php中利用array_filter过滤数组为空值

    [导读] 在我们开发过程中,判断数组为空时你会想到什么方法呢?首先想到的应该是empty函数,不过直接用empty函数判断为空是不对的,因为当这个值是多维数的时候,empty结果是有值的.其实我们可以 ...

  7. 在MVC中利用uploadify插件实现上传文件的功能

    趁着近段的空闲时间,开发任务不是很重,就一直想把以前在仓促时间里所写的多文件上传功能改一下,在网上找了很多例子,觉得uploadify还可以,就想用它来试试.实现自己想要的功能.根据官网的开发文档,同 ...

  8. 在ASP.NET MVC中利用Aspose.cells 将查询出的数据导出为excel,并在浏览器中下载。

    正题前的唠叨 本人是才出来工作不久的小白菜一颗,技术很一般,总是会有遇到一些很简单的问题却不知道怎么做,这些问题可能是之前解决过的.发现这个问题,想着提升一下自己的技术水平,将一些学的新的'好'东西记 ...

  9. 在Asp.Net MVC中利用快递100接口实现订阅物流轨迹功能

    前言 分享一篇关于在电商系统中同步物流轨迹到本地服务器的文章,当前方案使用了快递100做为数据来源接口,这个接口是收费的,不过提供的功能还是非常强大的,有专门的售后维护团队.也有免费的方案,类似于快递 ...

随机推荐

  1. 招聘一个靠谱的 iOS程序员

    一个靠谱的简历 简历非常能反映一个人的性格和水平,相比于你在学校获得多少奖项,工作经历.项目经 历.熟悉的技术等更加关键,如果还有博客和一些 Github 上的项目,好感度++,但记得在去面试前收拾下 ...

  2. Java 读取txt文件,读取结果保存到数据库

    需求:有一个很大的txt文件(1,000,000条数据),从txt中读取有用数据库后保存到Oracle数据库中 利用Java实现: 1.加载文件后一行一行读取 2.数据库连接后按行插入到数据库 pac ...

  3. Erlang 进程被抢占的条件——一个进程长时霸占调度器的极端示例

    最近研究 binary 的实现和各种操作对应的 beam 虚拟机汇编指令,发现有一些指令序列是不可重入的,比如说有的指令构造一个上下文(也就是某种全局状态),然后下一条指令会对这个上下文做操作(具体的 ...

  4. Effective Java 43 Return empty arrays or collections, not nulls

    Feature Return empty arrays or collection Return nulls Avoids the expense of allocating the array N ...

  5. 最锋利的Visual Studio Web开发工具扩展:Web Essentials详解(转)

    Web Essentials是目前为止见过的最好用的VS扩展工具了,具体功能请待我一一道来. 首先,从Extension Manager里安装:最新版本是19号发布的2.5版 然后重启你的VS开发环境 ...

  6. hdu 4635 Strongly connected 强连通缩点

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4635 题意:给你一个n个点m条边的图,问在图不是强连通图的情况下,最多可以向图中添多少条边,若图为原来 ...

  7. ArcGis 10+Oracle发布WFS-T服务,无法更新Feature的解决方法

    现象: 前端采用Openlayers,更新Feature时服务器端返回的XML提示更新错误 原因: 参考:http://support.esri.com/en/knowledgebase/techar ...

  8. linux 打包压缩工具

    以.gz结尾 gzip 压缩工具压缩的文件gzip+文件名[root@test ~]# gzip 2.txt[root@test ~]# ls2.txt.gz testgzip -d +压缩包[roo ...

  9. JVM相关问答

    大部分内容来源网络,整理一下,留个底. 问:堆和栈有什么区别? 答:堆是存放对象的,但是对象内的临时变量是存在栈内存中,如例子中的methodVar是在运行期存放到栈中的. 栈是跟随线程的,有线程就有 ...

  10. DFS cdoevs 3100 蜗牛

    cdoevs 3100 蜗牛  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 黄金 Gold 题目描述 Description 萨丽·斯内尔(Sally Snail,蜗牛)喜欢在 ...