我正在使用 XercesDOMParser 在 linux (c++) 中读取 xml 文件,我想防止 xml 炸弹(Billion 笑)所以我设置了这些属性:
parser->setDoNamespaces(true)
parser->setDisableDefaultEntityResolution(true)
parser->setEntityResolver(NULL)
parser->setSkipDTDValidation(true)
Run Code Online (Sandbox Code Playgroud)
然而,它没有帮助,炸弹仍然存在。你知道如何防止它吗(我只能在 DOM 中使用 xerces)
10 倍!
没有直接的方法可以防止实体膨胀,从而防止十亿笑声攻击。这是因为十亿笑声攻击可以是格式良好的 XML,并且XercesDOMParser是 DOM 的一种非常严格的实现。但是,您可以通过在 Xerces 中添加一个SecurityManager.
SecurityManager sm;
sm.setEntityExpansionLimit(100);
parser->setSecurityManager(&sm);
Run Code Online (Sandbox Code Playgroud)
如果您将它添加到您的代码中,SAXParseException当解析器扩展的实体数量超过您设置的数量(在本例中为 100)时,Xerces 将抛出 a 。这将阻止十亿次的笑声。