防御 XML 实体扩展攻击的最简单方法就是在 XML 解析逻辑架构中简单地禁用内联 DTD 模式的使用即尽量减少可能的攻击面:关闭并未使用的功能,这样攻击者就不能滥用职权。 如果应用程序体系结构要求解析内联DTD文件,就应该采取一些额外措施来保护代码。第一 步限制扩展的实体的大小。记住,这里讨论的攻击者通过创建扩展成大字符串的实体执行攻 击,并迫使解析器消耗大量内存。某些框架允许覆盖字符串数量(可通过实体扩展创建), 从而缓解攻击。例如,对于.NET 应用程序,就可以设置 XmlReaderSettings 对象的 MaxCharactersFromEntities属性来实现。确定合理的最大值,并设置相应的属性: 另一种 XML 实体攻击类型是外部实体解决方案攻击。没有将实体替换字符串定义为常 量,仍然可以定义他们以便于从外部URL中 pull值。 <!ENTITY stockprice SYSTEM "http://www.stockticker.cxx/price"> XmlReaderSettings settings = new XmlReaderSettings(); settings.ProhibitDtd = false; settings.MaxCharactersFromEntities = 1024; 虽然实际行为取决于所实现的特定的 XML 解析器,但是每当 XML 解析器遇到 “&stockprice;”实体时,解析器就会请求 http://www.stockticker.cxx/price,然后替 换从 stockprice 实体接收到的响应请求。该功能非常有用,但它给某些恶意的拒绝服务攻 击提供便利。 滥用外部实体功能的最简单方式就是将XML 解析器发送给永远不会返回的资源;也就是 说,发送到无限循环中。其他替代方案则是流回无限量数据,或者如果攻击者不能或不愿建 立自己的网页——可能是因为不想留下任何证据——那么反而可以在第三方网站上将外部 实体指向某个非常大的资源。 同样,防御这种攻击的最简单方式就是完全禁用内联DTD架构。如果想允许本地实体扩 展,但却不需要外部实体扩展,那么一些框架将允许你通过改变XML 解析器的冲突解析程序 来禁用外部实体扩展逻辑。该方法在不同框架中也不尽相同。在.NET 框架中,为了禁用外 部实体扩展,可以简单地设置XmlReaderSettings对象的XmlReader属性来设置无效属性: XmlReaderSettings settings = new XmlReaderSettings(); settings.XmlResolver = null; 然而,在某些Java XML解析器实施过程中,将解析器对象设置为解析器应使用默认解 析器的无效信号。 XMLReader reader = XMLReaderFactory.createXMLReader(); reader.setEntityResolver(null); 在这种情况下,需要实现自定义解析类。如果想解析外部实体,还需要实现自定义的解析程
该逻辑解决了账户在支付前固定持有的问题,但也造成了导致拒绝服务攻击漏洞的竞争 |