【问题标题】:Prevent xml bomb XercesDOMParser - C++防止 xml 炸弹 XercesDOMParser - C++
【发布时间】:2011-07-29 19:40:08
【问题描述】:

我正在使用 XercesDOMParser 在 linux (c++) 中读取一个 xml 文件,我想防止 xml 炸弹(亿笑)所以我设置了这些属性:

parser->setDoNamespaces(true)
parser->setDisableDefaultEntityResolution(true)
parser->setEntityResolver(NULL)
parser->setSkipDTDValidation(true)

但是,它没有帮助,炸弹仍然存在。 你知道如何预防吗(我只需要对 DOM 使用 xerces)

10 倍!

【问题讨论】:

    标签: c++ dom xerces


    【解决方案1】:

    没有直接的方法来防止实体扩展,从而防止十亿笑攻击。这是因为十亿笑攻击可以是格式良好的 XML,而XercesDOMParser 是一个非常严格的 DOM 实现。但是,您可以通过添加 SecurityManager 来防止 Xerces 中的十亿笑攻击。

    SecurityManager sm;
    sm.setEntityExpansionLimit(100);
    
    parser->setSecurityManager(&sm);
    

    如果您将其添加到您的代码中,当解析器扩展的实体数量超过您设置的实体数量(在本例中为 100)时,Xerces 将抛出 SAXParseException。这将阻止十亿人的笑声。

    【讨论】:

      【解决方案2】:

      或者,如果您想完全禁止使用实体,您可以在 DefaultHandler 上实现覆盖。在声明中:

      class MyHandler: public Xerces::DefaultHandler
      {
         <...>
          void internalEntityDecl(
              const XMLCh* const name,
              const XMLCh* const value) override;
      
      
          void externalEntityDecl(
              const XMLCh* const name,
              const XMLCh* const publicId,
              const XMLCh* const systemId) override;
      }
      

      在定义中:

      void
      XercesXMLHandler::internalEntityDecl(
          const XMLCh* const name,
          const XMLCh* const value )
      {
          FailBecauseEntity( name );
      }
      
      void
      XercesXMLHandler::externalEntityDecl(
          const XMLCh* const name,
          const XMLCh* const publicId,
          const XMLCh* const systemId )
      {
          FailBecauseEntity( name );
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-29
        • 2017-12-02
        • 2013-02-11
        • 2011-11-03
        • 2011-01-10
        • 2018-09-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多