让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 ...
随机推荐
- Linux CentOS 配置Tomcat环境
一.下载Tomcat 下载Tomcat方式也有两种,可以参考我的前一篇博文Linux CentOS配置JDK环境,这边就不再赘述. 二.在Linux处理Tomcat包 1.创建tomcat文件夹 mk ...
- 简单有效的kmp算法
以前看过kmp算法,当时接触后总感觉好深奥啊,抱着数据结构的数啃了一中午,最终才大致看懂,后来提起kmp也只剩下“奥,它是做模式匹配的”这点干货.最近有空,翻出来算法导论看看,原来就是这么简单(先不说 ...
- How those spring enable annotations work--转
原文地址:http://blog.fawnanddoug.com/2012/08/how-those-spring-enable-annotations-work.html Spring's Java ...
- node.js学习(二)--Node.js控制台(REPL)&&Node.js的基础和语法
1.1.2 Node.js控制台(REPL) Node.js也有自己的虚拟的运行环境:REPL. 我们可以使用它来执行任何的Node.js或者javascript代码.还可以引入模块和使用文件系统. ...
- 动手做第一个Chrome插件
Chrome插件是令人惊讶的简单,一旦你弄懂它的工作和实现原理.它是由一部分HTML,一部分Js,然后混合了一个叫做manifest.json的Json文件组合而成的整体.这意味着你可以使用你最擅长的 ...
- JavaScript基础知识总结(一)
当我们接触一种新语言时,首先要先了解它,对它有一定的理论认识. 那么,什么是JavaScript呢? JavaScript是一种脚本语言,由web浏览器进行解释和执行.它包括ECMAScript.DO ...
- [转载]网站地址栏小图标favicon.ico的制作方法
有人也许会好奇,有的网址前面有个漂亮的小图标而且有的网站图标还会动,这是怎么做到的呢? 如下图所示: 那个小图标有个名字叫favicon.ico,网站图标虽小但可以起到很好的点缀作用,尤其是当浏览者将 ...
- BPM配置故事之案例9-根据表单数据调整审批线路2
老李:好久不见啊,小明. 小明:-- 老李:不少部门有物资着急使用,现在的审批流程太慢了,申请时增加一个是否加急的选项吧.如果选加急,金额1000以下的直接到我这里,我审批完就通过,超过1000的直接 ...
- 算是休息了这么长时间吧!准备学习下python文本处理了,哪位大大有好书推荐的说下!
算是休息了这么长时间吧!准备学习下python文本处理了,哪位大大有好书推荐的说下!
- PC虚拟现实应用的性能分析与优化:从CPU角度切入
如今,虚拟现实 (VR) 技术正日益受到欢迎,这主要得益于遵循摩尔定律的技术进步让这一全新体验在技术上成为可能.尽管虚拟现实能给用户带来身临其境般的超凡体验,但相比传统应用,其具有双目渲染.低延迟.高 ...