ASP.Net 1.1后引入了对提交表单自动检查是否存在XSS(跨站脚本攻击)的能力。当用户试图用之类的输入影响页面返回结果的时候,ASP.Net的引擎会引发一 个 HttpRequestValidationExceptioin。默认情况下会返回如下文字的页面:

以下是引用片段:
Server Error in ''/YourApplicationPath'' Application

A potentially dangerous Request.Form value was detected from the client
(txtName="<b>").

Description: Request Validation has detected a potentially dangerous client input value, and processing of the request has been aborted. This value may indicate an attempt to compromise the security of your application, such as a cross-site scripting attack. You can disable request validation by setting validateRequest=false in the Page directive or in the configuration section. However, it is strongly recommended that your application explicitly check all inputs in this case.

Exception Details: System.Web.HttpRequestValidationException: A potentially dangerous Request.Form value was detected from the client (txtName="<b>").

....

  这是ASP.Net提供的一个很重要的安全特性。因为很多程序员对安全没有概念,甚至都不知道XSS这种攻击的存在,知道主动去防护的就更少了。ASP.Net在这一点上做到默认安全。这样让对安全不是很了解的程序员依旧可以写出有一定安全防护能力的网站。

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

  为什么很多程序员想要禁止 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 (ex is HttpRequestValidationException)

{

Response.Write("请您输入合法字符串。");

Server.ClearError(); // 如果不ClearError()这个异常会继续传到Application_Error()

}

}

  这样这个程序就可以截获 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;", "");

sb.Replace("&lt;i&gt;", "<i>");

sb.Replace("&lt;/i&gt;", "");

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');">

<img src="javascript:alert('hello');">

<img src="javascript:alert('hello');">

  通过<img>标签是有可能导致javascript执行的,这样攻击者就可以做他想伪装的任何事情。

  关于<style>也是一样:

以下是引用片段:

<style TYPE="text/javascript">...

alert('hello');

</style>

非禁用validateRequest=false使用Page_Error()错误处理相关推荐

  1. 关于ASP.Net的validateRequest=false(验证请求)

    ASP.Net的validateRequest=false validateRequest="false"   指是否要IIS验证页面提交的非法字符,比如:>,<号等, ...

  2. 通过在 Page 指令或 配置节中设置 validateRequest=false 可以禁用请求验证

    通过在 Page 指令或 配置节中设置 validateRequest=false 可以禁用请求验证 说明:   请求验证过程检测到有潜在危险的客户端输入值,对请求的处理已经中止.该值可能指示危及应用 ...

  3. validateRequest=false 可以禁用请求验证

    参看了MVP的利用WebClient和WebRequest类获得网页源代码于是想自己动手写点,当然是参考其的办法啦. 我这次下载了visual web developer 2005 express 按 ...

  4. 通过在 Page 指令或 配置节中设置 validateRequest=false 可以禁用请求验证

    说明:   请求验证过程检测到有潜在危险的客户端输入值,对请求的处理已经中止.该值可能指示危及应用程序安全的尝试,如跨站点的脚本攻击.通过在   Page   指令或   配置节中设置   valid ...

  5. (转)通过在 Page 指令或 配置节中设置 validateRequest=false 可以禁用请求验证

    通过在 Page 指令或 配置节中设置 validateRequest=false 可以禁用请求验证 说明:   请求验证过程检测到有潜在危险的客户端输入值,对请求的处理已经中止.该值可能指示危及应用 ...

  6. 转 pages validateRequest =false

    < pages validateRequest ="false"/> 二.注意 1.在web.config中system.web节加入: <pages valid ...

  7. ASP.NET 4.0: 请求验证模式变化导致ValidateRequest=false失效

    ASP.NET请求验证功能可以给我提供应用程序的安全保证,避免站点受到XSS的攻击.但是在一些情况下,我们需要禁用这个功能,比如我们需要使用HtmlEditor来让用户输入一些HTML文本,这时候AS ...

  8. MVC中validateRequest=false不起作用

    MVC Request.QueryString 客户端 潜在危险 在MVC中如果传递xml等参数时,会报"从客户端中检测到有潜在危险的Request.QueryString值"的错 ...

  9. asp.net学习笔记异常处理001---.framework4.0中asp.net页面ValidateRequest=false 无效的问题

    在做牛腩新闻发布系统的时候,部分同学可能会遇到这样的情况: 从客户端(ContentPlaceHolder1_m_ContentPlaceHolder_ftbContent="<P&g ...

最新文章

  1. nginx try_files的理解
  2. 问题集锦(52-53)
  3. C++ number of positive divisors计算正除数的实现算法(附完整源码)
  4. ActiveMQ 消息持久化到Mysql数据库
  5. Activity的四种启动模式-图文并茂
  6. Bootstrap3代码模板
  7. visual studio code安装
  8. WEB前端 盒子模型稳定性
  9. CISCO 5510 ASDM的实战总结
  10. oracle备份数据exp,oracle数据库备份之exp增量备份
  11. WPS无法用backspace删除空白页怎么办?
  12. 为你的网站添加一个帅气的IP签名档吧 – 教程附源码
  13. 软考高级已过,可以继续考软考中级吗?
  14. Go语言:模拟鼠标操作(go-vgo/robotgo)
  15. vue中递归组件实现多级列表
  16. 第五人格服务器维护中怎么办6,第五人格新联动刚来就出问题,紧急停服维护,这得补偿多少?...
  17. python单链表就地反转_Python中的就地字典反转
  18. idea的excluded
  19. 微信小程序界面及硬件实物图
  20. JS 中文数转数字练习

热门文章

  1. 真实Java面试场景汇总-一!
  2. 查找mac下腾讯视频下载地址
  3. 圣诞节,中国开源世界炸锅了@阿里巴巴
  4. excel乘法公式怎么输入_EXCEL基础课程
  5. sap 分摊分配不产生会计凭证的原因_#MM 物料凭证没有产生相应的会计凭证, 为什么呢? 怎么预防。...
  6. 数字电子技术基础 学习笔记1
  7. MCE公司:抑癌蛋白新助手——USP7小分子抑制剂
  8. 小米前员工创办TAKI喜克品牌已被维刻收购
  9. Keil5安装教程(C51与MDK共存)
  10. Random类生成随机数详解