我正在使用XercesDOMParser来读取linux(c ++)中的xml文件,我想阻止xml炸弹(Billion笑)所以我设置了这些属性:
parser->setDoNamespaces(true)
parser->setDisableDefaultEntityResolution(true)
parser->setEntityResolver(NULL)
parser->setSkipDTDValidation(true)
然而,它没有帮助,炸弹仍然存在。 你知道如何防止它(我必须只使用带有DOM的xerces)
10倍!
答案 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 );
}