问题

使用MVC的同学十有八九都会遇到这个错误:从客户端(Content="<script>...")中检测到有潜在危险的Request.Form 值。

这个错误是在请求中,用户输入的内容包含一些特殊字符而导致的,这是MVC为防止XSS而考虑的。

比如我们需要在后台发布一篇新闻,新闻的内容是富文本编辑器编辑得到HTML,那么在请求到Action的时候,默认的就会出现这个错误。

方案1

解决这个错误通常的做法是,在处理请求的Action上增加特性:[ValidateInput(false)]

方案2

方案一的做法有些过于大方了,该特性允许使得本次请求的所有参数都放弃了验证。

还是以发布新闻为例,需要提交标题和内容,那么即使标题中包含特殊字符,也会忽略验证。显然,这不是我们想要的。

我们其实想要的是,只允许新闻内容属性不验证,其他的属性默认还是要验证。

比如,我们给不需要验证的属性,增加一个[xxx]特性。

事实上,MVC实现了这样一个特性:[AllowHtml]

详细见:https://docs.microsoft.com/en-us/dotnet/api/system.web.mvc.allowhtmlattribute?view=aspnet-mvc-5.2

方案3

方案二基本满足了我们的需求,但是有一点,该特性在MVC命名空间下定义。往往我们的Model类是独立的类库,如果使用该特性,还需要引入MVC dll,感觉不是很好。

那么我们自己实现这样一个特性,标记在指定的属性上,在ModelBinder绑定属性的时候,包含该特性的属性,指定其不验证。

1.首先在global.asax中指定新的DefaultBinder

ModelBinders.Binders.DefaultBinder = new MyModelBinder();

2.定义MyAtrr

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
public class MyAttribute : Attribute
{ }

3.实现MyModelBinder

public class MyModelBinder : DefaultModelBinder
{
  protected override object GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder)
  {
bool containMyAttr = propertyDescriptor.Attributes.OfType<MyAttribute>().Any();
if (containMyAtrr)
{
bindingContext.ModelMetadata.RequestValidationEnabled = false;
}
return base.GetPropertyValue(controllerContext, bindingContext, propertyDescriptor, propertyBinder);
  }
}

ModelBiner不验证某个属性的更多相关文章

  1. ModelState验证部分属性

    ModelState.Remove("Name") 去掉不需要验证的属性.

  2. Silverlight实例教程 - Validation数据验证基础属性和事件(转载)

    Silverlight 4 Validation验证实例系列 Silverlight实例教程 - Validation数据验证开篇 Silverlight实例教程 - Validation数据验证基础 ...

  3. 关于entityframework 自动生成实体类中加验证的属性重新生成后属性被覆盖解决办法

    1.手动创建一个部分类 (你可以手动创建 partial class, 内容为空) [MetadataType(typeof(AppleMetadata))] public partial class ...

  4. 自定义验证----required属性

    1,required属性 - 表示字段不能为空(注意:只有用户单击“提交”按钮提交表单的时候,浏览器才会执行验证.目前HTML5不支持指定验证的时间,而且验证消息的样式和内容各个浏览器不大一样,不能修 ...

  5. com.microsoft.sqlserver.jdbc.SQLServerException: 通过端口 1433 连接到主机 127.0.0.1 的 TCP/IP 连接失败。错误:“Connection refused: connect。请验证连接属性。确保 SQL Server 的实例正在主机上运行,且在此端口接受 TCP/IP 连接,还要确保防火墙没有阻止到此端口的 TCP 连接。”

    检查SQL Server Configuration Manager 确定实例名为"SKYSQLEXPRESS"下的TCP/IP已经开启了: sql2014配置(系统为Window ...

  6. Newtonsoft.Json.Linq.JObject 遍历验证每个属性内容

    业务需求,拦截器验证每个请求inputstream(实际是application/json流)的数据,但是json反序列化实体格式不同. var req = filterContext.Request ...

  7. 《Sqlserver》通过端口 8080 连接到主机 localhost 的 TCP/IP 连接失败。错误:“驱动程序收到意外的登录前响应。请验证连接属性,并检查 SQL Server 的实例正在主机上运行,且在此端口接受

    1. 点击 开始 --> 所有程序 --> Microsoft SQL Server2005 --> 配置工具-->SQL Server configuration Manag ...

  8. HTML5 Web Form 新增属性和表单验证

    <form>标签的基本属性 method属性:指定浏览器向服务器传送数据的方式,可选: action属性:设置服务器接受和处理表单数据的URL: enctype属性:制定表单数据在发送到服 ...

  9. React 学习(二) ---- props验证与默认属性

    在上一节中, 我们提到了props, 组件之间数据的传递使用props. 我们调用组件时可以设置props, 组件内部通过props获取. 为了props 使用更加友好, React 提供了简单的验证 ...

随机推荐

  1. js实现图片变化

    CSS .home{ position: relative; width: 100%; height: 900px; overflow: hidden; } .home #tup{ position: ...

  2. VSS(Virtual Switching System)

    一.虚拟交换系统(VSS) VSS是一种网络虚拟化技术,讲两台Catalyst 6500系列交换机组合为单一虚拟交换机,从而提高运营效率.增强不间断通信,并将系统带宽容量扩展到1.4Tbps.在初始阶 ...

  3. 2019春第七周作业Compile Summarize

    这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 在这里 我在这个课程的目标是 能更加进一步的够熟练掌握指针的用法 这个作业在那个具体方面帮助我实现目标 指针对于基础题目的做法 参考文献与 ...

  4. python continue的应用

    count = 1sum = 0while count < 100: if count == 88: count += 1 continue if count % 2 == 0: sum = s ...

  5. 从合并两个Map说开去 - foldLeft 和 foldRight 还有模式匹配

    开发中遇到需求:合并两个Map集合对象(将两个对应Key的值累加) 先说解决方案: ( map1 /: map2 ) { )) ) } 首先: Scala中现有的合并集合操作不能满足这个需求 . 注意 ...

  6. [js]展开运算符

    function f(...args){ console.log(args); } f(1,2,3,4,5) [...args] = [1,2,3,4] function f(...args){ co ...

  7. linux运维需要掌握什么知识?linux运维学习路线

    linux运维需要掌握什么知识?这个问题算是老生常谈了,但是本人认为知道需要掌握什么知识不是重点,重点是我们需要知道运维是做什么的?再来根据工作需求去讨论需要学习什么知识才是正途,须知知识是学不完的, ...

  8. Random Forest总结

    一.简介 RF = Bagging + Decision Tree 随机:数据采样随机,特征选择随机 森林:多个决策树并行放在一起 几个误区: 不是每棵树随机选择特征,而是每一个结点都随机选择固定数目 ...

  9. 爬取豆瓣电影影评,生成wordcloud词云,并利用监督学习根据评论自动打星

    本文的完整源码在git位置:https://github.com/OceanBBBBbb/douban-ml 爬取豆瓣影评 爬豆瓣的影评比较简单,豆瓣没有做限制,甚至你都不用登陆就可以看全部,我这里用 ...

  10. vue知识总结

    vue: 渐进式JavaScript 框架 Vue项目构建 npm install -g vue vue init webpack-simple my-project cd my-project np ...