博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

ValidateRequest="false"

Posted on 2008-07-10 14:35  LonelyStar  阅读(1139)  评论(0编辑  收藏  举报
在asp.net中引入了对提交表单自动检查是否存在XSS(跨站脚本攻击)的能力,当用户试图用特殊的输入影响页面返回结果的时候,例如<table>等候他们了标签,ASP.Net的引擎会引发一个 HttpRequestValidationExceptioin异常。这是ASP.Net提供的一个很重要的安全特性。因为很多程序员对安全没有概念,甚至都不知道XSS这种攻击的存在,知道主动去防护的就更少了。ASP.Net在这一点上做到默认安全。这样让对安全不是很了解的程序员依旧可以写出有一定安全防护能力的网站。

如果允许输入这种特殊字符的话,你可以在页面中的page标签中加入ValidateRequest="false",或者是在web.config中添加<pages validateRequest="false">,这样就可以允许整个站点都不进行XSS的检查。

如果引发HttpRequestValidationExceptioin异常以后,页面中会默认提示一个黄页错误的,如果你想禁止出现这种不友好的黄页错误的话,请不要禁用validateRequest=false,你可以在代码中控制的。

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

 1protected void Page_Error(object sender, EventArgs e)
 2        {
 3            Exception ex = Server.GetLastError();
 4
 5            if (ex.GetType() == typeof(HttpRequestValidationException))
 6            {
 7                Server.ClearError();
 8                Response.Redirect("ErrorPage.aspx");
 9            }

10        }

11

 


也可以在基类中添加异常处理的方法:
 1protected override void OnError(EventArgs e)
 2        {
 3            base.OnError(e);
 4
 5            Exception ex = Server.GetLastError();
 6
 7            if (ex.GetType() == typeof(HttpRequestValidationException))
 8            {
 9                Server.ClearError();
10                Response.Redirect("ErrorPage.aspx");
11            }

12        }

如果不用ClearError()这个异常会继续传到Application_Error()。

XSS又叫CSS  (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。XSS属于被动式的攻击,因为其被动且不好利用,所以许多人常呼略其危害性。