非禁用validateRequest=false使用Page_Error()错误处理

非禁用validateRequest=false使用Page_Error()错误处理ASP.Net1.1后引入了对提交表单自动检查是否存在XSS(跨站脚本攻击)的能力。当用户试图用之类的输入影响页面返回结果的时候,ASP.Net的引擎会引发一个HttpRequestValidationExceptioin。默认情况下会返回如下文字的页面:以下是引用片段:ServerErrorin”/YourApplicationPath”Applicat

大家好,又见面了,我是你们的朋友全栈君。    
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>

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

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

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


相关推荐

  • MATLAB 柱状图(Bar) 如何快速更改堆叠图的颜色

    MATLAB 柱状图(Bar) 如何快速更改堆叠图的颜色直接上成图:代码很简单:clearclccloseallX=[8,1,9,3,6,9,3,5,43,2,9,2,6,4,9,5,1];X=X’;color_matrix=[1,1,10.5,0.5,0.5];%%用矩阵存储RGB三色数据,也可以直接赋值h1=bar(X(:,1:2),1);set(h1(1),’facecolor’,color_matrix(1,:))set(h1(2)

    2022年10月18日
    0
  • 剑指Offer面试题:4.从尾到头打印链表建议收藏

    一题目:从尾到头打印链表代码实现采用两种方法实现:(1)不修改原列表,使用stack的方式实现(2)修改原列表,对元列表逆序两种方法都在下面的代码中:

    2021年12月19日
    36
  • ubuntu 20.04 安装中文输入法_ubuntu20.04安装中文输入法

    ubuntu 20.04 安装中文输入法_ubuntu20.04安装中文输入法在安装ubuntu时,如果选择英文安装,默认会不启用中文输入法的。可以通过下述方法开启:在settings的Region&amp;amp;amp;amp;amp;amp;Language的InputSources设置栏中点击+添加Chinese(IntelligentPinyin)最后,重启后使之生效。…

    2022年9月25日
    3
  • ES6数组常用方法总结[通俗易懂]

    ES6数组常用方法总结[通俗易懂]这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好!这是你第一次使用Markdown编辑器所展示的欢迎页。如果你想学习如何使用Mar

    2022年6月3日
    45
  • 惠普电脑有电脑管家吗_电脑管家检测硬件就蓝屏

    惠普电脑有电脑管家吗_电脑管家检测硬件就蓝屏据海外媒体WindowsLatest的报道,大量的Windows10用户的设备最近频繁出现蓝屏,多家硬件设备厂商均中招。联想电脑管家安全团队已证实暂不涉及联想设备的国内用户。同时提醒广大国内用户,暂停近期微软发布的任何更新业务(包括暂停通过Vantage应用程序进行BIOS更新),等待微软官方给出修复补丁。据悉该蓝屏问题是由于近期的一次更新造成,蓝屏(BSOD)错误将会阻止windows10设备的…

    2022年8月13日
    11
  • c++和java哪个好学_选 Python 还是 Java ?[通俗易懂]

    c++和java哪个好学_选 Python 还是 Java ?[通俗易懂]对于在校学生,以及要转行学编程的,把一门语言熟悉起来,非常的重要。对于初学编程,以及想要转行到编程领域的人来说,总有这么一个选择,选C++、Python、还是Java好呢?哪个前景更好、哪个好学、哪个好找工作,等等这类问题。熟悉我的都知道,我是从LinuxC/C++后台开发,转行到算法工程师,在大四实习的时候,做过Go开发,大四下做毕设的时候,用过Java、以及前端一些技术;相对…

    2022年7月7日
    27

发表回复

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

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