Предотвратить xml бомбу XercesDOMParser - C ++ - PullRequest
1 голос
/ 05 апреля 2011

Я использую XercesDOMParser для чтения XML-файла в Linux (C ++), я хочу предотвратить бомбу XML (миллиард смеется), поэтому я установил следующие свойства:

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

Однако это не помогаети бомба еще останется.Вы знаете, как это предотвратить (я должен использовать xerces только с DOM)

10x!

Ответы [ 2 ]

3 голосов
/ 26 июля 2011

Не существует прямого способа предотвратить расширение сущности и, таким образом, предотвратить атаку миллиарда смеха.Это связано с тем, что миллиарды атак смеха могут быть правильно сформированным XML, а XercesDOMParser является довольно строгой реализацией DOM.Однако вы можете предотвратить атаку на миллиард смеха в Xerces, добавив SecurityManager.

SecurityManager sm;
sm.setEntityExpansionLimit(100);

parser->setSecurityManager(&sm);

. Если вы добавите это в свой код, Xerces выдаст SAXParseException, когда анализатор расширится больше, чемколичество установленных вами сущностей, в данном случае 100. Это предотвратит миллиард смеха.

0 голосов
/ 14 июня 2016

Или, если вы хотите полностью исключить использование сущностей, вы можете реализовать переопределения в 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 );
}
...