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

警告:为了安全请不要随意将ASP.Net的validateRequest=”false” .ASP.Net1.1后引入了对提交表单自动检查是否存在XSS(跨站脚本攻击)的能力。当用户试图用之类的输入影响页面返回结果的时候,ASP.Net的引擎会引发一个HttpRequestValidationExceptioin。默认情况下会返回如下文字的页面:ServerErrorin’/YourApplicationPath’ApplicationApot

大家好,又见面了,我是你们的朋友全栈君。

ASP.Net 1.1后引入了对提交表单自动检查是否存在
XSS(跨站脚本攻击)的能力。当用户试图用<xxxx>之类的输入影响页面返回结果的时候,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页面中加入这么一段代码:

 

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


{

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

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

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

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

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

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

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

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

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

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

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

示例代码如下:

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


{

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

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

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

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

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

警告:为了安全请不要随意将ASP.Net的validateRequest="false" .
<
img 
src
=”javascript:alert(‘hello’);”
>

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

<
img 
src
=”java&#010;script:alert(‘hello’);”
>

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

<
img 
src
=”java&#X0A;script:alert(‘hello’);”
>

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

关于<style>也是一样:

警告:为了安全请不要随意将ASP.Net的validateRequest="false" .
警告:为了安全请不要随意将ASP.Net的validateRequest="false" .
<
style 
TYPE
=”text/javascript”
>


警告:为了安全请不要随意将ASP.Net的validateRequest="false" .  alert(‘hello’);
警告:为了安全请不要随意将ASP.Net的validateRequest="false" .

</
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


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/135308.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • idea修改快捷键方法总结

    前言:使用idea也有一短时间了(算算也快2个月),在快捷键方面常用的基本上都熟悉了,现在有时间总结一下修改快捷键的方法,这对于idea老鸟来说简直是小菜,但是对于菜鸟来还是有些帮助的一:切换快捷键注意:idea内置的许多IDE的快捷键,假如你是从其他IDE转过来的,但是有不想放弃自己以前已经习惯的那套快捷键。那么你可以直接切换到你以前IDE的快捷键,方法如下:1.打开设置中心:file–>Se

    2022年4月5日
    692
  • windows修改dns服务器,windowns中dns服务器配置与管理详解(多图)

    windows修改dns服务器,windowns中dns服务器配置与管理详解(多图)安装DNS服务器在”服务器管理器”-“角色”-“添加角色”中安装DNS服务器。选择DNS服务器点下一步安装,然后安装固定服务器IP地址安装完DNS和配置好固定ip后,我们就可以开始配置DNS。在”开始”-“管理工具”-DNS打开DNS正向区域的建立并为其设置主机。选择”正向查找区域”-右击-新建区域。填写域名之后全部默认设置,直至完成。域名建立之后,我们就可以为其”新建主机”选择”hzu.com”…

    2022年6月3日
    125
  • PowerBI通过gateway连接多维数据库

    PowerBI通过gateway连接多维数据库

    2021年11月26日
    46
  • HTML中的window对象和document对象详解

    HTML中的window对象和document对象详解Window–代表浏览器中一个打开的窗口:对象属性  window//窗口自身  window.self//引用本窗户window=window.self  window.name//为窗口命名  window.defaultStatus//设定窗户状态栏信息  window.location//URL地址,配备布置这个属性可以打开新的页面对象方

    2022年7月19日
    34
  • linux配置ip转发

    linux配置ip转发====ip转发======1、vim/etc/sysctl.conf修改配置net.ipv4.ip_forward=1重启sysctl-p2、192.168.1.1:3307转发到192.168.1.2:3307shell下执行:iptables-tnat-APREROUTING-ptcp–dport3307-jDNAT–to-de…

    2022年6月6日
    58
  • 如何组装配置属于自己的台式机电脑_台式电脑怎么组装的

    如何组装配置属于自己的台式机电脑_台式电脑怎么组装的如何组装配置属于自己的台式机现在电脑这么普及,大部分人都有自己的电脑,有的是台式机,有的是笔记本。很多朋友配台式机时都是直接去电脑城然后商家给配置方案或者找认识的朋友推荐一套配置方案,但是有些时候会

    2022年8月4日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号