【发布时间】:2014-08-22 23:18:42
【问题描述】:
从 libxml 2.9 开始,在解析 XML 时加载外部实体已被禁用,以防止XXE attacks。
在这种情况下,为了能够在使用 PHP 的 DOMDocument 解析 XML 时加载 DTD 文件,必须指定 LIBXML_DTDLOAD。
在启用LIBXML_DTDLOAD 之前,验证仅预期的DTD 将被加载的好方法是什么?
我能想到的一种方法(如下面的示例代码所示)是禁用实体加载,解析一次 XML 文件,检查 DOCTYPE 声明是否符合预期,然后在启用实体加载的情况下再次解析 XML .这样就够了吗?
<?php
$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Publishing DTD v1.0 20120330//EN" "http://jats.nlm.nih.gov/publishing/1.0/JATS-journalpublishing1.dtd">
<article/>
XML;
// entity loading disabled
libxml_disable_entity_loader();
$doc = new DOMDocument;
$doc->loadXML($xml, LIBXML_DTDLOAD); // PHP Warning: DOMDocument::load(): I/O warning : failed to load external entity
print $doc->doctype->systemId; // http://jats.nlm.nih.gov/publishing/1.0/JATS-journalpublishing1.dtd
// entity loading enabled
libxml_disable_entity_loader(false);
$doc = new DOMDocument;
$doc->loadXML($xml, LIBXML_DTDLOAD);
print $doc->doctype->systemId; // http://jats.nlm.nih.gov/publishing/1.0/JATS-journalpublishing1.dtd
【问题讨论】:
-
满足什么?您能否将此作为一个具体的编程问题? -- 可能重复:Clarifications on XXE vulnerabilities throughout PHP versions(待回答)
-
如前所述,问题是“在启用 LIBXML_DTDLOAD 之前,验证 仅 加载预期 DTD 的好方法是什么?”
-
(这意味着):如果您使用
LIBXML_DTDLOAD,这些 DTD 是否实际加载?你测试过吗?另请在您的问题中提供示例数据和代码。我们需要一个例子来重现和清晰 - 至少如果你想要一个充分而清晰的答案。根据我在链接问题中的测试,无论您的设置如何,这些都不会加载。但我不确定该测试的稳定性。 -
我已将示例代码添加到问题中。
-
+1 为活泼的例子 :)
标签: php xml security domdocument dtd