从客户端中检测到有潜在危险的 Request.Form 值 方法

因为在.net中,Request时出现有HTML或Javascript等字符串时,系统会认为是危险性值。立马报出“从客户端 中检测到有潜在危险的Request.Form值”这样的错。

   解决方案一: 
   在.aspx文件头中加入这句: 
   <%@ Page validateRequest="false" %>
eg:<%@ Page Language="C#" AutoEventWireup="false" ValidateRequest="false" CodeFile="你的页面.vb" Inherits="你的页面" %>

   解决方案二: 
   修改web.config文件: 
   <configuration> 
   <system.web> 
   <pages validateRequest="false" /> 
   </system.web> 
   </configuration> 
   由于validateRequest默认值为true。只要设为false便可。

 通常是这么解决得可是通过小灰得提醒javascript

 这么解决得好html

   转自http://www.svnhost.cn/Article/Detail-33.shtml java

 

asp.net开发中,常常遇到“从客户端检测到有潜在危险的Request.Form 值”错误提示,不少人给出的解决方案是:程序员

一、web.config文档<system.web>后面加入这一句: <pages validaterequest="false"/> 
示例: 
<?xml version="1.0" encoding="gb2312" ?> 
<configuration> 
<system.web> 
<pages validaterequest="false"/> 
</system.web> 
</configuration>web

二、在*.aspx文档头的page中加入validaterequest="false",示例以下: 
<%@ page validaterequest="false" language="c#" codebehind="index.aspx.cs" autoeventwireup="false" inherits="mybbs.webform1" %> 
 c#

其实这样作是不正确的,会给程序安全带来风险。安全

  ASP.Net 1.1后引入了对提交表单自动检查是否存在XSS(跨站脚本攻击)的能力。当用户试图用之类的输入影响页面返回结果的时候,ASP.Net的引擎会引起一个 HttpRequestValidationExceptioin。这是ASP.Net提供的一个很重要的安全特性。由于不少程序员对安全没有概念,甚至都不知道XSS这种攻击的存在,知道主动去防御的就更少了。ASP.Net在这一点上作到默认安全。这样让对安全不是很了解的程序员依旧能够写出有必定安全防御能力的网站。app

  可是,当我Google搜索 HttpRequestValidationException 或者 "A potentially dangerous Request.Form value was detected from the client"的时候,惊奇的发现大部分人给出的解决方案居然是在ASP.Net页面描述中经过设置 validateRequest=false 来禁用这个特性,而不去关心那个程序员的网站是否真的不须要这个特性。看得我这叫一个胆战心惊。安全意识应该时时刻刻在每个程序员的内心,无论你对安全的概念了解多少,一个主动的意识在脑子里,你的站点就会安全不少。asp.net

  为何不少程序员想要禁止 validateRequest 呢?有一部分是真的须要用户输入"<>"之类的字符。这就没必要说了。还有一部分其实并非用户容许输入那些容易引发XSS的字符,而是讨厌这种报错的形式,毕竟一大段英文加上一个ASP.Net典型异常错误信息,显得这个站点出错了,而不是用户输入了非法的字符,但是本身又不知道怎么不让它报错,本身来处理报错。编辑器

  对于但愿很好的处理这个错误信息,而不使用默认ASP.Net异常报错信息的程序员们,大家不要禁用validateRequest=false。

  正确的作法是在你当前页面添加Page_Error()函数,来捕获全部页面处理过程当中发生的而没有处理的异常。而后给用户一个合法的报错信息。若是当前页面没有Page_Error(),这个异常将会送到Global.asax的Application_Error()来处理,你也能够在那里写通用的异常报错处理函数。若是两个地方都没有写异常处理函数,才会显示这个默认的报错页面呢。

  举例而言,处理这个异常其实只须要很简短的一小段代码就够了。在页面的Code-behind页面中加入这么一段代码:

protected void Page_Error(object sender, EventArgs e)
{
Exception ex = Server.GetLastError();
if (HttpContext.Current.Server.GetLastError() is HttpRequestValidationException)
{
HttpContext.Current.Response.Write("请输入合法的字符串【<a href=\"javascript:history.back(0);\">返回</a>】");
HttpContext.Current.Server.ClearError();
}
}

  这样这个程序就能够截获 HttpRequestValidationException 异常,并且能够按照程序员的意愿返回一个合理的报错信息。

  这段代码很简单,因此我但愿全部不是真的要容许用户输入之类字符的朋友,千万不要随意的禁止这个安全特性,若是只是须要异常处理,那么请用相似于上面的代码来处理便可。

  而对于那些经过 明确禁止了这个特性的程序员,本身必定要明白本身在作什么,并且必定要本身手动的检查必须过滤的字符串,不然你的站点很容易引起跨站脚本攻击。

  关于存在Rich Text Editor的页面应该如何处理?

  若是页面有富文本编辑器的控件的,那么必然会致使有类的HTML标签提交回来。在这种状况下,咱们不得不将validateRequest="false"。那么安全性怎么处理?如何在这种状况下最大限度的预防跨站脚本攻击呢?

  根据微软的建议,咱们应该采起安全上称为“默认禁止,显式容许”的策略。

  首先,咱们将输入字符串用 HttpUtility.HtmlEncode()来编码,将其中的HTML标签完全禁止。

  而后,咱们再对咱们所感兴趣的、而且是安全标签,经过Replace()进行替换。好比,咱们但愿有""标签,那么咱们就将""显式的替换回""。

void submitBtn_Click(object sender, EventArgs e)
{
//将输入字符串编码,这样全部的HTML标签都失效了。
StringBuilder sb = new StringBuilder(HttpUtility.HtmlEncode(htmlInputTxt.Text));
//而后咱们选择性的容许<b> 和 <i>
sb.Replace("&lt;b&gt;", "<b>");
sb.Replace("&lt;/b&gt;", "</b>");
sb.Replace("&lt;i&gt;", "<i>");
sb.Replace("&lt;/i&gt;", "</i>");
Response.Write(sb.ToString());
}
 
 

 

这样咱们即容许了部分HTML标签,又禁止了危险的标签。

根据微软提供的建议,咱们要慎重容许下列HTML标签,由于这些HTML标签都是有可能致使跨站脚本攻击的。


<applet> 
<body> 
<embed> 
<frame> 
<script> 
<frameset> 
<html> 
<iframe> 
<img> 
<style> 
<layer> 
<link> 
<ilayer> 
<meta> 
<object>


可能这里最让人不能理解的是<img>。可是,看过下列代码后,就应该明白其危险性了。
<img src="javascript:alert('hello');">

   <httpRuntime requestValidationMode="2.0" targetFramework="4.5" maxQueryStringLength="204800" />

参考:http://www.cnblogs.com/qizhinan/p/4077818.html

相关文章
相关标签/搜索