让ASP.NET接受有“潜在危险”的提交

public class HomeController : Controller {
public ActionResult Index() {
return View();
}
[HttpPost]
public ActionResult Index(string p1) {
ViewBag.P1 = p1;
return View();
}
}
再改一下View:
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div>
<p>@ViewBag.P1</p>
<form method="post">
<input type="text" name="p1" />
<input type="submit" />
</form>
</div>
</body>
</html>
代码很简单,我们尝试给p1写点值,然后回显,输入个什么“123”或者“abc”是没问题的,但如果尝试输入“<a>”或者“<script>”之类的,就会出现:

“从客户端中检测到有潜在危险的Request.Form值”,和之前的出错提示有些类似,但也有显著不同,注意看,现在的Exception变成了HttpRequestValidationException,而不是之前的HttpException了。
public class HomeController : Controller {
public ActionResult Index() {
return View();
}
[HttpPost]
public ActionResult Index(string p1) {
string p2 = Request.QueryString["p2"];
ViewBag.P1 = p1;
ViewBag.P2 = p2;
return View();
}
}
View也改一下:
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div>
<p>@ViewBag.P1</p>
<p>@ViewBag.P2</p>
<form method="post">
<input type="text" name="p1" />
<input type="submit" />
</form>
</div>
</body>
</html>
<system.web>
<httpRuntime requestPathInvalidCharacters="" requestValidationMode="2.0" /> <!--避免了URL路径的检查-->
<pages validateRequest="false"></pages> <!--避免了aspx页面对URL参数及表单数据的检查-->
</system.web>
但我们如今一般都很少用Web Form了,大家都MVC了对吧?对于ASP.NET MVC,还需要加一个全局过滤器,来避免其对URL参数及表单数据的检查,在Application_Start()中加入:
GlobalFilters.Filters.Add(new ValidateInputAttribute(false));
ALL DONE!
没有了“潜在危险”检查,假如危险真的来临了,那可怎么办?你是说XSS吗?一般情况下,如果你不需要像论坛那样让允许用户提交“富文本”的话,直接用HTML Encode来呈现数据就肯定不会有XSS问题啊,用户尝试提交一段JavaScript,你用HTML Encode了之后,提交啥,就直接在页面上显示啥,也没啥好担心的,使用到@Html.Raw的时候就要格外小心一些,差不多就OK了。但如果你真的需要允许客户提交富文本的话,情况就变得有些复杂了,有以下解决方案来避免XSS:
<a href="javascript: danger();">danger</a>
<p onclick="danger();">danger</p>
<div style="width: expression(danger());">danger</div>
看吧,防不胜防,还有各种不同的标签哦,各种onXXX事件,一些更高明的嵌套手法,唉,想做好是很难的了,这种方法不推荐!
第二种方法可以考虑使用HtmlAgilityPack这个库,用它来解释客户端提交上来的内容,一个个Tag去遍历。我建议使用“白名单”机制,只允许有限的tag,比如<a>,<p>,<div>,<ul>,<ol>,<li>等,遇到不认识的一律移除,这些标签里,也只允许有限的属性,遇到诸如“onXXX”这种不在白名单里的属性一律移除,这样就差不多了,还剩下一个比较麻烦的就是<a>标签的href属性,这个得做点特殊处理,自己判断一下这里边是否有潜在的危险,我的做法是:
static readonly Regex _regexIsSafe = new Regex("^([a-z][a-z,0-9]*):");
static bool IsLegalLink(string link) {
link = link.Trim().ToLower();
Match match = _regexIsSafe.Match(link);
if (match.Success) {
string schema = match.Groups[].Value;
if (!"http".Equals(schema) && !"https".Equals(schema)) {
return false;
}
}
return true;
}
让ASP.NET接受有“潜在危险”的提交的更多相关文章
- ASP.NET检测到有潜在危险的 Request.Form 值解决方案汇总
ASP.NET检测到有潜在危险的 Request.Form 值解决方案汇总 当我们在网站中使用CKEditor等富文本编辑器时,大多都会遇到这样的到警告 这是因为ASP.NET默认开启对页面提交内容的 ...
- 检测到有潜在危险的 Request.Form 值。 说明: ASP.NET 在请求中检测到包含潜在危险的数据
在请求方法的顶部添加 [ValidateInput(false)]就OK了 从客户端(Content=" sdfdddd ...")中检测到有潜在危险的 Reques ...
- ASP.NET MVC从客户端中检测到有潜在危险的 Request.Form 值
ASP.NET MVC4(Razor)从客户端中检测到有潜在危险的 Request.Form 值 “/”应用程序中的服务器错误. 从客户端(Content=" sdfdddd ...&quo ...
- asp.net 从客户端中检测到有潜在危险的 Request.Form 值错误解
从客户端(ftbContent="<P><A href="http://l...")中检测到有潜在危险的 Request.Form 值. 说明: 请求验 ...
- ASP.NET MVC4(Razor)从客户端中检测到有潜在危险的 Request.Form 值
SP.NET MVC4(Razor)从客户端中检测到有潜在危险的 Request.Form 值 “/”应用程序中的服务器错误. 从客户端(Content=" sdfdddd ..." ...
- asp.net从客户端检测到有潜在危险的Request.Form 值
asp.net开发中,经常遇到“从客户端检测到有潜在危险的Request.Form 值”错误提示,很多人给出的解决方案是: 1.web.config文档<system.web>后面加入这一 ...
- Asp.net mvc3的“从客户端中检测到有潜在危险的 Request.Form 值”问题解决
Asp.net mvc3的“从客户端(content_v=\",<p>\n\t<imgalt=\"\" src...\")中检测到有潜在危险的 ...
- asp.net MVC 自定义模型绑定 从客户端中检测到有潜在危险的 Request.QueryString 值
asp.net mvc 自定义模型绑定 有潜在的Requset.Form 自定义了一个模型绑定器.前端会传过来一些敏感字符.调用bindContext. valueProvider.GetValue( ...
- 解决ASP.NET MVC 检测到有潜在危险的 Request.Form 值
提交使用html编辑器编辑后的数据,由于Request时出现有HTML或JavaScript等字符串时,系统会认为是危险性值.立马报错. "从客户端 ... 中检测到有潜在危险的 Reque ...
随机推荐
- Python学习--04条件控制与循环结构
Python学习--04条件控制与循环结构 条件控制 在Python程序中,用if语句实现条件控制. 语法格式: if <条件判断1>: <执行1> elif <条件判断 ...
- BootStrap_02之全局样式及组件
1.BootStrap指定的四种屏幕尺寸: ①超大PC屏幕--lg(large):w>=1200px: ②中等PC屏幕--md(medium):1200px>w>=992px: ③P ...
- 很多人很想知道怎么扫一扫二维码就能打开网站,就能添加联系人,就能链接wifi,今天说下这些格式,明天做个demo
有些功能部分手机不能使用,网站,通讯录,wifi基本上每个手机都可以使用. 在看之前你可以扫一扫下面几个二维码先看看效果: 1.二维码生成 网址 (URL) 包含网址的 二维码生成 是大家平时最常接触 ...
- CRL快速开发框架系列教程十一(大数据分库分表解决方案)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- How those spring enable annotations work--转
原文地址:http://blog.fawnanddoug.com/2012/08/how-those-spring-enable-annotations-work.html Spring's Java ...
- 来吧,HTML5之基础标签(上)
什么是html5 HTML 5 是下一代的 HTML.HTML5 仍处于完善之中.然而,大部分现代浏览器已经具备了某些 HTML5 支持. 学习过程中标签的理解 <a>标签 定义超链接, ...
- PHP好用但又容易忽略的小知识
1.PHP函数之判断函数是否存在 当我们创建了自定义函数,并且了解了可变函数的用法,为了确保程序调用的函数是存在的,经常会先使用function_exists判断一下函数是否存在.同样的method_ ...
- angluarjs2项目生成内容合并到asp.net mvc4项目中一起发布
应用场景 angular2(下文中标注位NG2)项目和.net mvc项目分别开发,前期采用跨域访问进行并行开发,后期只需要将NG2项目的生产版本合并到.net项目. NG2项目概述 ng2项目采用的 ...
- Cesium简介以及离线部署运行
Cesium简介 cesium是国外一个基于JavaScript编写的使用WebGL的地图引擎,一款开源3DGIS的js库.cesium支持3D,2D,2.5D形式的地图展示,可以自行绘制图形,高亮区 ...
- ORACLE中STATUS为INACTIVE但是SERVER为SHARED状态的会话浅析
我们知道当ORACLE数据库启用共享服务器模式时,通过共享服务器模式连接到数据库的会话是有一些特征的.在v$session里面,其SERVER的状态一般为SHARED和NONE, 为SHARED时,表 ...