如何在解析 XML 时禁用 XInclude?
How to disable XInclude when parsing XML?
我了解到 XInclude
在从不受信任的来源接收 XML 时是一个潜在的漏洞。参见 https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet#Java
我期望从外部来源得到的 XML 非常简单,从来没有任何要求包含外部 XML。
我已经尝试了以下方法来禁用 XInclude(按照作弊 Sheet 中的建议):
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 攻击的正确方法吗?
这是避免 XInclude 和实体攻击的正确方法,但正如您发现的那样,这不是 XInclude 攻击的有效测试。
根据this answer、"XInclude support relies on namespace support, which is turned off by default for backward compatibility reasons"。所以调用 dbf.setNamespaceAware(true);
我了解到 XInclude
在从不受信任的来源接收 XML 时是一个潜在的漏洞。参见 https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet#Java
我期望从外部来源得到的 XML 非常简单,从来没有任何要求包含外部 XML。
我已经尝试了以下方法来禁用 XInclude(按照作弊 Sheet 中的建议):
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 攻击的正确方法吗?
这是避免 XInclude 和实体攻击的正确方法,但正如您发现的那样,这不是 XInclude 攻击的有效测试。
根据this answer、"XInclude support relies on namespace support, which is turned off by default for backward compatibility reasons"。所以调用 dbf.setNamespaceAware(true);