解析XML时如何禁用XInclude?

时间:2018-11-06 08:53:42

标签: java xml xxe

据我了解,XInclude是从不受信任的来源接收XML时的潜在漏洞。参见https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet#Java

我期望从外部来源获得的XML非常简单,并且从不要求包含外部XML。

我已经尝试了以下方法来禁用XInclude(如备忘单中的建议):

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setXIncludeAware(false);
dbf.setExpandEntityReferences(false);

并使用此XML进行测试

<?xml version="1.0" encoding="utf-8"?>
<data xmlns:xi="http://www.w3.org/2001/XInclude">
    <xi:include href="file://d/temp/badxml.xml" parse="xml">
    </xi:include>
</data>

外部文件包含无效的XML。

我曾预计,如果将setXIncludeAware设置为true,则解析器将失败,但事实并非如此。该代码段始终是可解析的。我正在使用Java 8。

这是有效的测试吗?这是避免XInclude攻击的正确方法吗?

1 个答案:

答案 0 :(得分:1)

这是避免XInclude和实体攻击的正确方法,但这并不是对XInclude攻击的有效测试。

根据this answer,“ XInclude支持依赖于名称空间支持,出于向后兼容的原因,默认情况下该功能已关闭”。因此致电dbf.setNamespaceAware(true);