asp.net MVC 自定义模型绑定 从客户端中检测到有潜在危险的 Request.QueryString 值
asp.net mvc 自定义模型绑定 有潜在的Requset.Form
自定义了一个模型绑定器。前端会传过来一些敏感字符。调用bindContext. valueProvider.GetValue(key) 则会报错 说 有潜在的从客户端中检测到有潜在危险的 Request.QueryString 值
百度谷歌都没有找到相关答案
MVC自带的默认绑定器(DefaultModelBinder)在action方法打上[ValidateInput(false)]或则在跳过验证的字段上打上[AllowHtml] 特性则可以跳过敏感字符验证
下载MVC4源码发现 他在获取的其中一个绑定方法
public virtual object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
EnsureStackHelper.EnsureStack();
if (bindingContext == null)
{
throw new ArgumentNullException("bindingContext");
}
bool performedFallback = false;
if (!String.IsNullOrEmpty(bindingContext.ModelName) && !bindingContext.ValueProvider.ContainsPrefix(bindingContext.ModelName))
{
// We couldn't find any entry that began with the prefix. If this is the top-level element, fall back
// to the empty prefix.
if (bindingContext.FallbackToEmptyPrefix)
{
bindingContext = new ModelBindingContext()
{
ModelMetadata = bindingContext.ModelMetadata,
ModelState = bindingContext.ModelState,
PropertyFilter = bindingContext.PropertyFilter,
ValueProvider = bindingContext.ValueProvider
};
performedFallback = true;
}
else
{
return null;
}
}
// Simple model = int, string, etc.; determined by calling TypeConverter.CanConvertFrom(typeof(string))
// or by seeing if a value in the request exactly matches the name of the model we're binding.
// Complex type = everything else.
if (!performedFallback)
{
bool performRequestValidation = ShouldPerformRequestValidation(controllerContext, bindingContext);
ValueProviderResult valueProviderResult = bindingContext.UnvalidatedValueProvider.GetValue(bindingContext.ModelName, skipValidation: !performRequestValidation);
if (valueProviderResult != null)
{
return BindSimpleModel(controllerContext, bindingContext, valueProviderResult);
}
}
if (!bindingContext.ModelMetadata.IsComplexType)
{
return null;
}
return BindComplexModel(controllerContext, bindingContext);
}
红色处发现他在获取参数之前获得一个bool值,
点开看看这个方法
private static bool ShouldPerformRequestValidation(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
if (controllerContext == null || controllerContext.Controller == null || bindingContext == null || bindingContext.ModelMetadata == null)
{
// To make unit testing easier, if the caller hasn't specified enough contextual information we just default
// to always pulling the data from a collection that goes through request validation.
return true;
}
// We should perform request validation only if both the controller and the model ask for it. This is the
// default behavior for both. If either the controller (via [ValidateInput(false)]) or the model (via [AllowHtml])
// opts out, we don't validate.
return (controllerContext.Controller.ValidateRequest && bindingContext.ModelMetadata.RequestValidationEnabled);
}
//看注释好像发现了什么 让我们通过打特性 来跳过验证
.发现他的getValue 有个重载 如果传入true则可以跳过验证
高兴的回去改自己的代码 发现bindContext.valueProvider的值提取器是接口类型System.Web.Mvc.ModelBindingContext.ValueProvider 他是没有重载方法的
看看这个东东ValueProviderResult valueProviderResult = bindingContext.UnvalidatedValueProvider.GetValue(bindingContext.ModelName, skipValidation: !performRequestValidation); 的UnvalidatedValueProvider到底是什么
public IValueProvider ValueProvider { get; set; }
internal IUnvalidatedValueProvider UnvalidatedValueProvider
{
get { return (ValueProvider as IUnvalidatedValueProvider) ?? new UnvalidatedValueProviderWrapper(ValueProvider); }
}
看到这里 回头修改自己的代码吧
//如果是基本类型 直接在值提供器中拿值绑定
if (property.PropertyType.IsValueType || property.PropertyType == typeof (string))
{
var newkey = property.Name;
if (Regex.IsMatch(key, @"\[\w*\]"))
{
newkey = key + "[" + newkey + "]";
}
var value = bindingContext.ValueProvider.GetValue(newkey);
if (value == null)
{
//再尝试获取一次
var valueProvider = (bindingContext.ValueProvider as IUnvalidatedValueProvider);
newkey = key + "[" + newkey + "]";
value = valueProvider.GetValue(newkey,true);
}
当然这么做还是不严谨的 我们需要也像defualtModelBind一样 通过特性来标示是否跳过验证。而不是所有使用模型绑定的action请求都跳过验证
asp.net MVC 自定义模型绑定 从客户端中检测到有潜在危险的 Request.QueryString 值的更多相关文章
- MVC去掉传参时的验证:从客户端中检测到有潜在危险的Request.QueryString值
解决方法:给Action添加属性[ValidateInput(false)]. 例: [ValidateInput(false)] public ActionResult Index(string o ...
- 从客户端中检测到有潜在危险的 Request.QueryString 值
解决办法: 一.解决方法是在web.config的 里面加入<system.web> <pages validateRequest="false"/>< ...
- 从客户端中检测到有潜在危险的 request.form值 以及 request.querystring[解决方法]
一.从客户端中检测到有潜在危险的request.form值 当页面编辑或运行提交时,出现“从客户端中检测到有潜在危险的request.form值”问题,该怎么办呢?如下图所示: 下面博主汇总出现这种错 ...
- ASP.NET MVC从客户端中检测到有潜在危险的 Request.Form 值
ASP.NET MVC4(Razor)从客户端中检测到有潜在危险的 Request.Form 值 “/”应用程序中的服务器错误. 从客户端(Content=" sdfdddd ...&quo ...
- MVC中提示错误:从客户端中检测到有潜在危险的 Request.Form 值的详细解决方法
今天往MVC中加入了一个富文本编辑框,在提交信息的时候报了如下的错误:从客户端(Content="<EM ><STRONG ><U >这是测试这...&q ...
- ASP.NET MVC4(Razor)从客户端中检测到有潜在危险的 Request.Form 值
SP.NET MVC4(Razor)从客户端中检测到有潜在危险的 Request.Form 值 “/”应用程序中的服务器错误. 从客户端(Content=" sdfdddd ..." ...
- 【异常记录(七)】MVC:从客户端中检测到有潜在危险的 Request.Form 值 的解决方法 [转]
从客户端(Content="<EM ><STRONG ><U >这是测试这...")中检测到有潜在危险的Request.Form 值. 说明: ...
- mvc 从客户端 中检测到有潜在危险的 Request.Form 值
天往MVC中加入了一个富文本编辑框,在提交信息的时候报了如下的错误:从客户端(Content="<EM ><STRONG ><U >这是测试这...&qu ...
- [转]从客户端中检测到有潜在危险的 Request.Form 值。
参考资料: ASP.NET 4.0中使用FreeTextBox和FCKeditor遇到安全问题警告的解决办法关于问题出现的原因说的很清楚 引言 本人在.NET 4.0+VS2010环境下调试一个ASP ...
随机推荐
- LeetCode 5_Longest Palindromic Substring
LeetCode 5_Longest Palindromic Substring 题目描写叙述: Given a string S, find the longest palindromic sub ...
- GET,POST,PUT,DELETE的区别 和 用法
Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP ...
- 深度学习利器:TensorFlow在智能终端中的应用——智能边缘计算,云端生成模型给移动端下载,然后用该模型进行预测
前言 深度学习在图像处理.语音识别.自然语言处理领域的应用取得了巨大成功,但是它通常在功能强大的服务器端进行运算.如果智能手机通过网络远程连接服务器,也可以利用深度学习技术,但这样可能会很慢,而且只有 ...
- Asura监控---AsuraMonitor,阿修罗监控开源
阿修罗Monitor是一个功能强大.灵活的监控系统. 系统安装简单,配置简单,相比zabbix, nagios,cacti,小米监控等都使用相当简单.只需要会写脚本,语言不限就可以实现任意监控需求. ...
- AIX 常用命令汇总(一)
命令 内核 如何知道自己在运行 32 位内核还是 64 位内核? 要显示内核启用的是 32 位还是 64 位,可输入以下命令: bootinfo -K 如何知道自己在运行单处理器还是多处理器内核? / ...
- C - Elephant(贪心)
Problem description An elephant decided to visit his friend. It turned out that the elephant's house ...
- Solr.NET快速入门(五)【聚合统计,分组查询】
聚合统计 属性 说明 Min 最小值 Max 最大值 Sum 总和 Count 记录数,也就是多少行记录 Missing 结果集中,有多少条记录是空值 SumOfSquares 平方和(x1^2 + ...
- 利用Aspose.Cells导出Datatable数据
面对一些的格式各样的到处数据的要求,自学了一点 Aspose.Cells中操作Excel知识,如下代码: /// <summary> /// DataTable导出Excel /// &l ...
- .net几种文件下载的方法
.Net文件下载方式.... 之前在写上传文件.下载文件的时候,发现Response对象里面有好几种下载文件的方式,之后自己亲自实践了这几种方法,记录下以便以后复习... WriteFile文件下载 ...
- 异常及String
异常时描述错误信息的对象,在编码过程中我们会遇到很多异常 例如: 1.java.lang.ArithmeticException 算数异常.算数运算出现错误时抛出 比如用0做除数 2.java.lan ...