asp.net 从客户端中检测到有潜在危险的 Request.Form 值
2012-03-21 18:27
204 查看
Request时出现有HTML或Javascript等字符串时,系统会认为是危险性值。立马报错上面的错误。ASP.Net 引入了对提交表单自动检查是否存在跨站脚本攻击的能力。当用户试图用js代码,html代码之类的输入影响页面返回结果的时候,ASP.Net的引擎会引发一个 HttpRequestValidationExceptioin的异常
正确的做法是在你当前页面添加Page_Error()函数,来捕获所有页面处理过程中发生的而没有处理的异常。然后给用户一个合法的报错信息。如果当前页面没有Page_Error(),这个异常将会送到Global.asax的Application_Error()来处理,你也可以在那里写通用的异常报错处理函数。如果两个地方都没有写异常处理函数,才会显示这个默认的报错页面呢。
举例而言,处理这个异常其实只需要很简短的一小段代码就够了
这段代码很简单,所以我希望所有不是真的要允许用户输入之类字符的朋友,千万不要随意的禁止这个安全特性,如果只是需要异常处理,那么请用类似于上面的代码来处理即可。
而对于那些通过 明确禁止了这个特性的程序员,自己一定要明白自己在做什么,而且一定要自己手动的检查必须过滤的字符串,否则你的站点很容易引发跨站脚本攻击。
关于存在Rich Text Editor的页面应该如何处理?
如果页面有富文本编辑器的控件的,那么必然会导致有类的HTML标签提交回来。在这种情况下,我们不得不将validateRequest="false"。那么安全性怎么处理?如何在这种情况下最大限度的预防跨站脚本攻击呢?
根据微软的建议,我们应该采取安全上称为“默认禁止,显式允许”的策略。
首先,我们将输入字符串用 HttpUtility.HtmlEncode()来编码,将其中的HTML标签彻底禁止。
然后,我们再对我们所感兴趣的、并且是安全标签,通过Replace()进行替换。比如,我们希望有""标签,那么我们就将""显式的替换回""。
另外在如果要禁止ASP.NET4.0默认验证,在Web.Config中加入如下代码:
正确的做法是在你当前页面添加Page_Error()函数,来捕获所有页面处理过程中发生的而没有处理的异常。然后给用户一个合法的报错信息。如果当前页面没有Page_Error(),这个异常将会送到Global.asax的Application_Error()来处理,你也可以在那里写通用的异常报错处理函数。如果两个地方都没有写异常处理函数,才会显示这个默认的报错页面呢。
举例而言,处理这个异常其实只需要很简短的一小段代码就够了
protected void Page_Error(object sender, EventArgs e) { Exception ex = Server.GetLastError(); if (ex is HttpRequestValidationException) { Response.Write("请您输入合法字符串。"); // 如果不ClearError()这个异常会继续传到Application_Error() Server.ClearError(); } }
这段代码很简单,所以我希望所有不是真的要允许用户输入之类字符的朋友,千万不要随意的禁止这个安全特性,如果只是需要异常处理,那么请用类似于上面的代码来处理即可。
而对于那些通过 明确禁止了这个特性的程序员,自己一定要明白自己在做什么,而且一定要自己手动的检查必须过滤的字符串,否则你的站点很容易引发跨站脚本攻击。
关于存在Rich Text Editor的页面应该如何处理?
如果页面有富文本编辑器的控件的,那么必然会导致有类的HTML标签提交回来。在这种情况下,我们不得不将validateRequest="false"。那么安全性怎么处理?如何在这种情况下最大限度的预防跨站脚本攻击呢?
根据微软的建议,我们应该采取安全上称为“默认禁止,显式允许”的策略。
首先,我们将输入字符串用 HttpUtility.HtmlEncode()来编码,将其中的HTML标签彻底禁止。
然后,我们再对我们所感兴趣的、并且是安全标签,通过Replace()进行替换。比如,我们希望有""标签,那么我们就将""显式的替换回""。
void submitBtn_Click(object sender, EventArgs e) { // 将输入字符串编码,这样所有的HTML标签都失效了。 string inputStr = HttpUtility.HtmlEncode(htmlInputTxt.Text); StringBuilder sb = new StringBuilder(inputStr ); // 然后我们选择性的允许<b> 和 <i> sb.Replace("<b>", "<b>"); sb.Replace("</b>", ""); sb.Replace("<i>", "<i>"); sb.Replace("</i>", ""); Response.Write(sb.ToString()); }
另外在如果要禁止ASP.NET4.0默认验证,在Web.Config中加入如下代码:
<system.web> <httpRuntime requestValidationMode="2.0" /> <pages validateRequest="false" /> </system.web>
相关文章推荐
- ASP.NET MVC从客户端中检测到有潜在危险的 Request.Form 值
- ASP.NET 从客户端中检测到有潜在危险的 REQUEST.FORM 值
- 还在为asp.net中fckeditor报错从客户端(Content="<p>测试</p>")中检测到有潜在危险的 Request.Form 值吗
- asp.net 从客户端中检测到有潜在危险的 Request.Form 值
- asp.net 从客户端中检测到有潜在危险的 Request.Form 值
- asp.net 从客户端中检测到有潜在危险的 Request.Form 值错误解
- ASP.NET 4.0请求验证报错 从客户端...中检测到有潜在危险的 Request.Form 值
- asp.net mvc 从客户端中检测到有潜在危险的 Request.Form 值的解决方法
- 解决asp.net中“从客户端(......)中检测到有潜在危险的 Request.Form 值。”错误
- 解决asp.net中“从客户端(......)中检测到有潜在危险的 Request.Form 值。”错误
- asp.net mvc 处理”从客户端中检测到有潜在危险的 request.form 值。”
- asp.net从客户端检测到有潜在危险的Request.Form 值
- 使用Asp.net MVC 2.0 +.NET 4.0 出现 “从客户端 ... 中检测到有潜在危险的 Request.Form 值”错误的解决办法
- Asp.Net Mvc框架下的FckEdit控件 从客户端检测到有潜在危险的Request.Form值 .
- 在ASP.NET MVC中客户端使用文本编辑器检测到有潜在危险的 Request.Form 值。无法访问控制器。
- ASP.Net MVC从客户端中检测到有潜在危险的 Request.Form 值
- kindeditor asp.net 从客户端中检测到有潜在危险的 Request.Form 值
- asp.net 从客户端中检测到有潜在危险的 Request.Form 值错误解
- asp.net 从客户端中检测到有潜在危险的 Request.Form 值错误解
- ASP.NET从客户端中检测到有潜在危险的request.form值的3种解决方法