热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

警告:为了安全请不要随意将ASP.Net的validateRequest=”false”.

警告:为了安全请不要随意将ASP.Net的validateRequestfalse.ASP.Net1.1后引入了对提交表单自动检查是否存在XSS(跨站脚本攻击)的能力。当用户试


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=””).

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=””).

….

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

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

为什么很多程序员想要禁止 validateRequest 呢?有一部分是真的需要用户输入&#8221;<>&#8221;之类的字符。这就不必说了。还有一部分其实并不是用户允许输入那些容易引起XSS的字符,而是讨厌这种报错的形式,毕竟一大段英文加上一个ASP.Net典型异常错误信息,显得这个站点出错了,而不是用户输入了非法的字符,可是自己又不知道怎么不让它报错,自己来处理报错。

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

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

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

 


警告:为了安全请不要随意将ASP.Net的validateRequest=
protected
 
void
 Page_Error(
object
 sender, EventArgs e)
警告:为了安全请不要随意将ASP.Net的validateRequest=警告:为了安全请不要随意将ASP.Net的validateRequest=

&#8230;
{

警告:为了安全请不要随意将ASP.Net的validateRequest=    Exception ex 
= Server.GetLastError();
警告:为了安全请不要随意将ASP.Net的validateRequest=    
if (ex is HttpRequestValidationException)
警告:为了安全请不要随意将ASP.Net的validateRequest=警告:为了安全请不要随意将ASP.Net的validateRequest=    
&#8230;{

警告:为了安全请不要随意将ASP.Net的validateRequest=        Response.Write(
&#8220;请您输入合法字符串。&#8220;);
警告:为了安全请不要随意将ASP.Net的validateRequest=        Server.ClearError(); 
// 如果不ClearError()这个异常会继续传到Application_Error()。
警告:为了安全请不要随意将ASP.Net的validateRequest=
    }

警告:为了安全请不要随意将ASP.Net的validateRequest=}

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

这段代码很简单,所以我希望所有不是真的要允许用户输入之类字符的朋友,
千万不要随意的禁止这个安全特性,如果只是需要异常处理,那么请用类似于上面的代码来处理即可。

而对于那些通过 明确禁止了这个特性的程序员,自己一定要明白自己在做什么,而且一定要自己手动的检查必须过滤的字符串,否则你的站点很容易引发跨站脚本攻击。

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

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

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

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

然后,我们再对我们所感兴趣的、并且是安全标签,通过Replace()进行替换。比如,我们希望有&#8221;&#8221;标签,那么我们就将&#8221;&#8221;显式的替换回&#8221;&#8221;。

示例代码如下:


警告:为了安全请不要随意将ASP.Net的validateRequest=
  
void
 submitBtn_Click(
object
 sender, EventArgs e)
警告:为了安全请不要随意将ASP.Net的validateRequest=警告:为了安全请不要随意将ASP.Net的validateRequest=  

&#8230;
{

警告:为了安全请不要随意将ASP.Net的validateRequest=    
// 将输入字符串编码,这样所有的HTML标签都失效了。
警告:为了安全请不要随意将ASP.Net的validateRequest=
    StringBuilder sb = new StringBuilder(
警告:为了安全请不要随意将ASP.Net的validateRequest=                            HttpUtility.HtmlEncode(htmlInputTxt.Text));
警告:为了安全请不要随意将ASP.Net的validateRequest=    
// 然后我们选择性的允许
警告:为了安全请不要随意将ASP.Net的validateRequest=
    sb.Replace(&#8220;&#8221;, &#8220;&#8221;);
警告:为了安全请不要随意将ASP.Net的validateRequest=    sb.Replace(&#8220;
&#8221;, &#8220;&#8221;);
警告:为了安全请不要随意将ASP.Net的validateRequest=    sb.Replace(&#8220;&#8221;, &#8220;&#8221;);
警告:为了安全请不要随意将ASP.Net的validateRequest=    sb.Replace(&#8220;
&#8221;, &#8220;&#8221;
);
警告:为了安全请不要随意将ASP.Net的validateRequest=    Response.Write(sb.ToString());
警告:为了安全请不要随意将ASP.Net的validateRequest=  }

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

根据微软提供的建议,我们要慎重允许下列HTML标签,因为这些HTML标签都是有可能导致跨站脚本攻击的。


  • <applet>

  • <body>

  • <embed>

  • <frame>

  • <script>

  • <frameset>

  • <html>

  • <iframe>

  • <img>

  • <style>

  • <layer>

  • <link>

  • <ilayer>

  • <meta>

  • <object>

可能这里最让人不能理解的是。但是,看过下列代码后,就应该明白其危险性了。


警告:为了安全请不要随意将ASP.Net的validateRequest=
<
img 
src
=&#8221;Javascript:alert(&#8216;hello&#8217;);&#8221;
>

警告:为了安全请不要随意将ASP.Net的validateRequest=

<
img 
src
=&#8221;java&#010;script:alert(&#8216;hello&#8217;);&#8221;
>

警告:为了安全请不要随意将ASP.Net的validateRequest=

<
img 
src
=&#8221;java&#X0A;script:alert(&#8216;hello&#8217;);&#8221;
>

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

关于也是一样:


警告:为了安全请不要随意将ASP.Net的validateRequest=
警告:为了安全请不要随意将ASP.Net的validateRequest=
<
style 
TYPE
=&#8221;text/Javascript&#8221;
>
&#8230;

警告:为了安全请不要随意将ASP.Net的validateRequest=  alert(&#8216;hello&#8217;);
警告:为了安全请不要随意将ASP.Net的validateRequest=


style
>

参考:

HOW TO: 使用 Visual C# .NET 在 ASP.NET 中创建自定义错误报告


http://support.microsoft.com/kb/306355/zh-cn

HttpRequestValidationException 类 (System.Web)


http://msdn2.microsoft.com/zh-cn/library/system.web.httprequestvalidationexception(VS.80).aspx

MSDN: How To: Prevent Cross-Site Scripting in ASP.NET


http://msdn2.microsoft.com/en-us/library/ms998274.aspx

推荐大家阅读微软关于.Net安全的一系列文章:


http://msdn2.microsoft.com/en-us/library/ms978512.aspx

关于跨站脚本攻击请参考:

Wikipedia 维基大百科全书


http://en.wikipedia.org/wiki/Cross_site_scripting

Xfocus


http://www.xfocus.org/articles/200607/874.html

Google




http://www.google.com/search?q=%E8%B7%A8%E7%AB%99%E8%84%9A%E6%9C%AC%E6%94%BB%E5%87%BB





推荐阅读
  • SpringBoot启动脚本详解:BAT文件应用与基础入门指南(SpringBoot系列第1篇)
    如果你还在为SSM框架的复杂搭建过程和繁琐的配置文件而烦恼,那么SpringBoot将是你的一大福音。作为SpringBoot系列的第一篇文章,本文详细介绍了如何使用BAT文件来启动SpringBoot应用,并提供了基础入门指南,帮助开发者快速上手,简化开发流程。 ... [详细]
  • 基于Node.js的高性能实时消息推送系统通过集成Socket.IO和Express框架,实现了高效的高并发消息转发功能。该系统能够支持大量用户同时在线,并确保消息的实时性和可靠性,适用于需要即时通信的应用场景。 ... [详细]
  • 本文深入解析了 Apache 配置文件 `httpd.conf` 和 `.htaccess` 的优化方法,探讨了如何通过合理配置提升服务器性能和安全性。文章详细介绍了这两个文件的关键参数及其作用,并提供了实际应用中的最佳实践,帮助读者更好地理解和运用 Apache 配置。 ... [详细]
  • Spring Boot 实战(一):基础的CRUD操作详解
    在《Spring Boot 实战(一)》中,详细介绍了基础的CRUD操作,涵盖创建、读取、更新和删除等核心功能,适合初学者快速掌握Spring Boot框架的应用开发技巧。 ... [详细]
  • 深入解析Tomcat:开发者的实用指南
    深入解析Tomcat:开发者的实用指南 ... [详细]
  • MySQL性能优化与调参指南【数据库管理】
    本文详细探讨了MySQL数据库的性能优化与参数调整技巧,旨在帮助数据库管理员和开发人员提升系统的运行效率。内容涵盖索引优化、查询优化、配置参数调整等方面,结合实际案例进行深入分析,提供实用的操作建议。此外,还介绍了常见的性能监控工具和方法,助力读者全面掌握MySQL性能优化的核心技能。 ... [详细]
  • IIS配置大全:从基础到高级的全面指南
    IIS配置详解:从基础到高级的全面指南IIS前端配置与web.config文件紧密相关,相互影响。本文详细介绍了如何设置允许通过的HTTP请求方法,包括HEAD、POST、GET、TRACE和OPTIONS。提供了两种主要的配置方法,并探讨了它们在实际应用中的优缺点。此外,还深入讲解了其他高级配置选项,帮助读者全面提升IIS服务器的性能和安全性。 ... [详细]
  • Go语言中Goroutine与通道机制及其异常处理深入解析
    在Go语言中,Goroutine可视为一种轻量级的并发执行单元,其资源消耗远低于传统线程,初始栈大小仅为2KB,而普通线程则通常需要几MB。此外,Goroutine的调度由Go运行时自动管理,能够高效地支持成千上万个并发任务。本文深入探讨了Goroutine的工作原理及其与通道(channel)的配合使用,特别是在异常处理方面的最佳实践,为开发者提供了一套完整的解决方案,以确保程序的稳定性和可靠性。 ... [详细]
  • IIS 7及7.5版本中应用程序池的最佳配置策略与实践
    在IIS 7及7.5版本中,优化应用程序池的配置是提升Web站点性能的关键步骤。具体操作包括:首先定位到目标Web站点的应用程序池,然后通过“应用程序池”菜单找到对应的池,右键选择“高级设置”。在一般优化方案中,建议调整以下几个关键参数:1. **基本设置**: - **队列长度**:默认值为1000,可根据实际需求调整队列长度,以提高处理请求的能力。此外,还可以进一步优化其他参数,如处理器使用限制、回收策略等,以确保应用程序池的高效运行。这些优化措施有助于提升系统的稳定性和响应速度。 ... [详细]
  • 掌握PHP框架开发与应用的核心知识点:构建高效PHP框架所需的技术与能力综述
    掌握PHP框架开发与应用的核心知识点对于构建高效PHP框架至关重要。本文综述了开发PHP框架所需的关键技术和能力,包括但不限于对PHP语言的深入理解、设计模式的应用、数据库操作、安全性措施以及性能优化等方面。对于初学者而言,熟悉主流框架如Laravel、Symfony等的实际应用场景,有助于更好地理解和掌握自定义框架开发的精髓。 ... [详细]
  • Enhance Directives with a Dedicated Flag for Internet Explorer 11 Compatibility ... [详细]
  • 根据不同环境需求,利用 Vue CLI 的 `npm run build` 命令对项目进行定制化打包,如测试、预发布和生产环境。通过配置 `process.env` 变量,实现不同环境下接口和服务的动态切换,确保应用在各阶段都能高效运行和调试。 ... [详细]
  • 第五章详细探讨了 Red Hat Enterprise Linux 6 中的 Ext3 文件系统。5.1 节介绍了如何创建 Ext3 文件系统,包括必要的命令和步骤,以及在实际操作中可能遇到的问题和解决方案。此外,还涵盖了 Ext3 文件系统的性能优化和维护技巧,为用户提供全面的操作指南。 ... [详细]
  • 在Windows命令行中,通过Conda工具可以高效地管理和操作虚拟环境。具体步骤包括:1. 列出现有虚拟环境:`conda env list`;2. 创建新虚拟环境:`conda create --name 环境名`;3. 删除虚拟环境:`conda env remove --name 环境名`。这些命令不仅简化了环境管理流程,还提高了开发效率。此外,Conda还支持环境文件导出和导入,方便在不同机器间迁移配置。 ... [详细]
  • 在Python 3环境中,当无法连接互联网时,可以通过下载离线模块包来实现模块的安装。具体步骤包括:首先从PyPI网站下载所需的模块包,然后将其传输到目标环境,并使用`pip install`命令进行本地安装。此方法不仅适用于单个模块,还支持依赖项的批量安装,确保开发环境的完整性和一致性。 ... [详细]
author-avatar
gete
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有