DanceFire的专栏

天地不仁,以万物为刍狗

用户操作
[即时聊天] [发私信] [加为好友]
舞焰ID:DanceFire
266421次访问,排名229好友0人,关注者1
DanceFire的文章
原创 51 篇
翻译 4 篇
转载 0 篇
评论 928 篇
DanceFire的公告
最近评论
hqfmyway:出现过同样的问题,谢谢解惑!
phhwr85:非常感谢,正郁闷中!
herry0628:A gold website for wow gold and
buy wow gold sevise.
herry0628:A gold website for wow gold and
buy wow gold sevise.
herry0628:A gold website for wow gold and
buy wow gold sevise.
文章分类
收藏
    相册
    Unix家族族谱图
    编程语言家族族谱
    操作系统相关图片
    插图
    麒麟操作系统相关图片
    L4 微内核实现
    Fiasco - DROPS的底层微内核 (TU Dresden)
    L4Ka::Pistachio (UKa, UNSW)
    seL4 - Secure Embedded L4 (UNSW)
    L4 微内核研究组
    L4 总部
    UKa的L4研究组
    UNSW/NICTA的L4研究组
    L4 文档
    L4 X.2 API的用户手册(UNSW)
    L4-embedded 参考手册 N1 (UNSW)
    基于 L4 的操作系统
    Darwin在L4上的移植 - Darbat (UNSW)
    DROPS - 基于L4的嵌入式实时操作系统 (TU Dresden)
    GNU Hurd在L4上的移植
    Linux在L4上的移植 - L4Linux (TU Dresden)
    Linux在L4上的移植 - Wombat (UNSW)
    Mungi - Single Address Space OS based on L4 (UNSW)
    朋友
    Dancefire's website
    ralph623的专栏(RSS)
    sinboy的菜地(RSS)
    Sunwear(RSS)
    Xinsoft :应用之美,在于药到病除(RSS)
    吕震宇(RSS)
    强强专栏(RSS)
    旁观生活的BT(RSS)
    潇寒的Blog(RSS)
    龙真先生(RSS)
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

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

    新一篇: 中科院中文分词系统ICTCLAS之NShortPath代码的详细分析 | 旧一篇: Happy Birthday :)

    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页面中加入这么一段代码:
     
    protected void Page_Error(object sender, EventArgs e)
    {
        Exception ex 
    = Server.GetLastError();
        
    if (ex is HttpRequestValidationException)
        
    {
            Response.Write(
    "请您输入合法字符串。");
            Server.ClearError(); 
    // 如果不ClearError()这个异常会继续传到Application_Error()。
        }

    }


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

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

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

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

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

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

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

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

    示例代码如下:
      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>


    参考:

    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

    发表于 @ 2007年04月11日 10:52:00|评论(loading...)|编辑

    新一篇: 中科院中文分词系统ICTCLAS之NShortPath代码的详细分析 | 旧一篇: Happy Birthday :)

    评论

    #gaofeng2000 发表于2007-04-12 21:52:04  IP: 59.38.178.*
    对于有些情况如存在富文本编辑器,只能禁止该功能。
    #catty86 发表于2007-04-17 12:40:06  IP: 59.44.221.*
    谢谢指教:)
    #DanceFire 发表于2007-04-17 14:17:24  IP: 60.242.80.*
    to Gaofeng2000:你说的问题比较典型,所以我补充了关于富文本编辑器的处理方法。谢谢。
    #wisdom_zh 发表于2007-04-28 16:36:35  IP: 59.56.38.*
    好文, 支持!
    #wangyouworld 发表于2007-07-20 10:06:15  IP: 221.13.134.*
    谢谢啊,受用。以前总是不管这个问题,或者忽略……
    太谢谢了。找到解决方法。
    #Vilian 发表于2007-10-12 01:36:34  IP: 58.63.92.*
    找的就是你!!谢谢!!
    #herry0628 发表于2008-07-14 11:53:16  IP: 220.178.42.*
    A gold website for wow gold and
    buy wow gold sevise.
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © DanceFire