防止xml炸弹XercesDOMParser - C ++

时间:2011-04-05 09:26:40

标签: c++ dom xerces

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

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

然而,它没有帮助,炸弹仍然存在。 你知道如何防止它(我必须只使用带有DOM的xerces)

10倍!

2 个答案:

答案 0 :(得分:3)

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

SecurityManager sm;
sm.setEntityExpansionLimit(100);

parser->setSecurityManager(&sm);

如果将其添加到代码中,当解析器扩展的数量超过您设置的实体数量时,Xerces将抛出SAXParseException,在这种情况下为100.这将防止数十亿的笑声。

答案 1 :(得分:0)

或者如果您想完全禁止使用实体,可以在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 );
}