关于ASP.Net的validateRequest=false(验证请求)[通俗易懂]

关于ASP.Net的validateRequest=false(验证请求)[通俗易懂]ASP.Net的validateRequest=false      validateRequest=”false”  指是否要IIS验证页面提交的非法字符,比如:>,   ASP.Net1.1后引入了对提交表单自动检查是否存在XSS(跨站脚本攻击)的能力。当用户试图用之类的输入影响页面返回结果的时候,ASP.Net的引擎会引发一个HttpReques

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

ASP.Net的validateRequest=false

 

      validateRequest=”false”   指是否要IIS验证页面提交的非法字符,比如:>,<号等,当我们需要将一定格式得html代码获得,插入数据库时候,就要将这个属性设置为false,例如你将字体加粗等操作时。

   

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=”java&#010;script:alert(‘hello’);”>
<img src=”java&#X0A;script:alert(‘hello’);”>

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

  关于<style>也是一样:

以下是引用片段:
<style TYPE=”text/javascript”>…
alert(‘hello’);
</style>

 

 

 

 

 

 

 

备注:
一、什么是XSS攻击
XSS又叫CSS  (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的
html代码会被执行,从而达到恶意用户的特殊目的。XSS属于被动式的攻击,因为其被动且不好利用,所以许多人常呼略其危害性。而本文主要讲的是利用
XSS得到目标服务器的shell。技术虽然是老技术,但是其思路希望对大家有帮助。
如何寻找XSS漏洞
就个人而言,我把XSS攻击分成两类,一类是来自内部的攻击,主要指的是利用程序自身的漏洞,构造跨站语句,如:dvbbs的showerror.asp存在的跨站
漏洞。另一类则是来来自外部的攻击,主要指的自己构造XSS跨站漏洞网页或者寻找非目标机以外的有跨站漏洞的网页。如当我们要渗透一个站点,我们自
己构造一个有跨站漏洞的网页,然后构造跨站语句,通过结合其它技术,如社会工程学等,欺骗目标服务器的管理员打开。
如何利用
传统的跨站利用方式一般都是攻击者先构造一个跨站网页,然后在另一空间里放一个收集cookie的页面,接着结合其它技术让用户打开跨站页面以盗取
用户的cookie,以便进一步的攻击。个人认为这种方式太过于落后,对于弊端大家可能都知道,因为即便你收集到了cookie你也未必能进一步渗透进去,多
数的cookie里面的密码都是经过加密的,如果想要cookie欺骗的话,同样也要受到其它的条件的限约。而本文提出的另一种思路,则从一定程度上解决上述
的问题。对于个人而言,比较成熟的方法是通过跨站构造一个表单,表单的内容则为利用程序的备份功能或者加管理员等功能得到一个高权限。下面我将详
细的介绍这种技术。

 

 

<此贴为网上转载,博主注明>

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

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

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


相关推荐

  • mybatis一级缓存和二级缓存失效_mybatis二级缓存默认开启吗

    mybatis一级缓存和二级缓存失效_mybatis二级缓存默认开启吗1.缓存介绍Mybatis提供查询缓存,如果缓存中有数据就不用从数据库中获取,用于减轻数据压力,提高系统性能。Mybatis的查询缓存总共有两级,我们称之为一级缓存和二级缓存,如图:一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相…

    2022年9月20日
    2
  • 运行时常量池与字符串常量池_string字符串常量池

    运行时常量池与字符串常量池_string字符串常量池文章目录一、概念1、Class常量池(ClassConstantPool)1.1、常量池中数据项类型2、字符串池(StringPool、StringLiteralPool)2.1、参考文章:3、运行时常量池(RuntimeConstantPool)4、总结二、方法区的class文件信息,class常量池和运行时常量池的三者关系2.1、三者关系图:2.2、方法区class文…

    2022年9月9日
    2
  • robots.txt_Robots.txt:互联网幕后的一瞥「建议收藏」

    robots.txt_Robots.txt:互联网幕后的一瞥「建议收藏」robots.txtHere’sanexercise:openanewtabandtypeintheURLofyourfavoritewebsite.Add/robots.txttotheendandhitenter.这是一个练习:打开一个新选项卡,然后输入您喜欢的网站的URL。将/robots.txt添加到末尾,然后按Enter。There’…

    2022年5月20日
    42
  • AvaTrade · 爱华MT4软件下载

    AvaTrade · 爱华MT4软件下载这里写自定义目录标题爱华简称AVA,使用的交易软件为多数投资者使用的交易软件:MT4。因此爱华的下载和安装方式和其它的平台的MT4的下载和安装方法是一致的。首先要下载MT4软件,下载方法各个版本是一样的。首先要看版本,MT4软件分为网页版,手机版,mac版。手机版又细分为安卓版和IOS版。mt4。yhtz。cc可以看到上述的所有版本。网页和安卓版以及mac版是需要在网页下载的,当然就可以在爱华的网页上去下载安装包。另外IOS版的除在爱华的网页上下载外,也可以在苹果应用商店下载。爱华的MT4交

    2022年5月30日
    57
  • Allure 安装

    Allure 安装 一、命令行安装:1、Linux:sudoapt-add-repositoryppa:qameta/alluresudoapt-getupdatesudoapt-getinstallallure2、MacOSX:brewinstallallure3、Windows下先安装Scoop,再运行以下命令:scoopinstallallure…

    2022年7月26日
    9
  • matlab手写数字识别实验报告_如何用matlab将图像转为矩阵

    matlab手写数字识别实验报告_如何用matlab将图像转为矩阵本文主要是根据《matlab手写神经网络实现识别手写数字》博客中的代码进行试验。由于没有数据集,所以采用了MNIST数据集进行代码的运行。数据集不同所以需要对代码进行微小改动。简介数据处理:4000张作为训练样本,1000张作为测试样本;图像大小:图片的灰度值矩阵(28,28);图像名称:由标签和顺序号组成。标签_顺序号.bmp训练样本:每个数字的图像名称的顺序号是从0-399,各400…

    2022年9月14日
    3

发表回复

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

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