在开发过程中,有时候会对用户输入进行过滤,以便保证平台的安全性。屏蔽的方法有很多种,但是今天我说的这种主要是利用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中利用ViewBag传递Json数据时的前端处理方法

    ** MVC中利用ViewBag传递Json数据时的前端处理方法 ** 用viewBag传递Json字符串到前端时,json字符串中的"会被转义为& quot,前端处理方法为@Htm ...

  2. spring mvc项目中利用freemarker生成自定义标签

    2019独角兽企业重金招聘Python工程师标准>>> spring mvc项目中利用freemarker生成自定义标签 博客分类: java spring mvc +freemar ...

  3. mysql中的merge into,SQL Server 2008中利用merge into关键实现insert/update自动匹配(类似于MySQL中的For Update关键字)...

    SQL Server 2008中利用merge into关键实现insert/update自动匹配(类似于MySQL中的For Update关键字) 语法请参考: 按照语法编写语句 DECLARE @ ...

  4. mvc中嵌入ssrs报表_如何在SSRS报表中过滤多维OLAP多维数据集

    mvc中嵌入ssrs报表 Ever since the early days of my career, SQL Server Reporting Services (SSRS) has been o ...

  5. ASP.NET MVC中的身份验证

    传统的登录验证方式,是通过将用户的登录状态信息保存在服务端的Session中,再利用客户端浏览器的Cookie保存SessionID,这样浏览器每次在向服务端发起请求时,都会携带该Cookie值,服务 ...

  6. ASP.NET MVC: 使用自定义 ModelBinder 过滤敏感信息

    昨天发表了一篇随笔<ASP.NET MVC: 使用 Filters 附加过滤敏感信息功能>(以下简称<Filter过滤>),今天一早醒来发现一处重大漏洞,于是在发了一条评论指出 ...

  7. 如何在 Asp.Net Core MVC 中处理 null 值

    译文链接:https://www.infoworld.com/article/3434624/how-to-handle-null-values-in-aspnet-core-mvc.html 传统的 ...

  8. datagrid在MVC中的运用05-加入时间搜索条件,枚举填充下拉框

    本文主要来体验在搜索区域增加更多的搜索条件,主要包括: ※ 使用jQuery ui的datepicker显示时间,设置显示格式.样式. ※ 设置jQuery ui的onClose事件,使开始和结束时间 ...

  9. ai人工智能在手机的应用_何时更重要地在产品中利用人工智能

    ai人工智能在手机的应用 You need to go from your house to the Airport. Do you take a Limo or a bike? Of course ...

最新文章

  1. 异步请求之XMLHttpRequest篇
  2. 选型必看:RabbitMQ 七战 Kafka,差异立现
  3. 关于hibernate的实体类中有集合类型转化成JSON的工具类 - 怀念今天的专栏 - 博客频道...
  4. System.PlatformNotSupportedException
  5. DataTables中设置checkbox回显选中
  6. 【Linux环境】简单Shell脚本实现定时备份文件、压缩、删除超时文件操作(showDoc文件备份脚本举例)
  7. 自由职业半年,我又滚回职场了...
  8. C/C++基本数据类型
  9. 使用XShell连接Cygwin
  10. java 局部指定jdk版本_[Java教程]tomcat之一:指定tomcat运行时JDK版本
  11. Netty原理:Channel
  12. 怎样配置 Docker IPv6 ?
  13. STATA如何进行斯皮尔曼检验
  14. 西部数据将旗下绿盘系列产品归入为蓝盘系列产品
  15. a360desktop有用吗_A360 Desktop 停用 - 2018 年 6 月 19 日
  16. 人工智能专业就业方向有哪些?
  17. 运放放大倍数计算公式_模电的半壁江山——运算放大器的原理和应用
  18. 【嵌入式】GPIO驱动LED设计
  19. 5分钟了解单片机数据、地址、控制总线结构
  20. 计算机基础知识教程优秀篇,计算机基础知识优秀教案.doc

热门文章

  1. c是过程化语言吗数据库,关于SQL错误的是()A、所有数据库的公共语言B、非过程化的C、统一的语言D、所有用SQL缩写的程序都...
  2. vue防抖和节流是什么_JavaScript防抖与节流,你知道多少?
  3. php中常用的运算符和表达式有哪几种,php 运算符与表达式详细介绍
  4. python桌面应用html_是否将Python后端与HTML / CSS / JS用户界面集成到桌面应用程序? - javascript...
  5. ElasticSearch查询返回信息根据字段排序(英文检索)
  6. 2020国货彩妆市场研究报告
  7. oracle查询sql记录数,oracle查询所有表的记录数SQL
  8. python中grid函数_python tkinter中的grid布局是什么?
  9. 作者:孙忠富(1957-),男,中国农业科学院农业环境与可持续发展研究所研究员。...
  10. 作者:牛新(1983-),男,博士,国防科学技术大学并行与分布处理重点实验室助理研究员...