我正在编写一个在PHP中使用XML API的Web应用程序,我担心三个特定的漏洞,都与内联DOCTYPE定义有关:本地文件包含,二次实体爆炸和指数实体爆炸.我喜欢使用PHP的(5.3)内置库,但我想确保我不会受这些影响.
我发现我可以使用libxml_disable_entity_loader消除LFI,但这对内联ENTITY声明没有帮助,包括引用其他实体的实体.
SimpleXML库(SimpleXMLElement,simplexml_load_string等)很棒,因为它是一个DOM解析器,我的所有输入都很小; 它允许我使用xpath并非常容易地操作DOM.我无法想象如何停止ENTITY声明.(如果可能,我很乐意禁用所有内联DOCTYPE定义.)
XML Parser库(xml_parser_create,xml_set_element_handler等)允许我使用xml_set_default_handler设置包含实体的默认处理程序.我可以破解它,因此对于无法识别的实体,它只返回原始字符串(即"&ent;").这个库令人沮丧:因为它是一个SAX解析器,我必须编写一堆处理程序(多达9 ..).
那么是否可以使用内置库,获取类似DOM的对象,并保护自己免受这些各种DoS漏洞的影响?谢谢
这个页面描述了三个漏洞,并提供了一个解决方案...如果我只使用.NET:http://msdn.microsoft.com/en-us/magazine/ee335713.aspx
更新:
<?php
$s = <<<EOF
<?xml version="1.0?>
<!DOCTYPE data [
<!ENTITY en "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....">
]>
<data>&en;&en;&en;&en;&en;&en;&en;&en;&en;&en;&en;&en;.....</data>
EOF;
$doc = new DOMDocument();
$doc->loadXML($s);
var_dump($d->lastChild->nodeValue);
?>
Run Code Online (Sandbox Code Playgroud)
我也试过loadXML($s, LIBXML_NOENT);了.在这两种情况下,我最终倾销300多MB.有什么东西我还在遗失吗?
我在 PHP 5 中使用 SimpleXML 解析 XML,但外部实体不起作用。XML 解析,但实体只是空白。底层库是 libxml2。
这是代码:
libxml_disable_entity_loader(false);
simplexml_load_file($target_file);
Run Code Online (Sandbox Code Playgroud)
它按预期解析 XML,但不解析外部实体并且似乎忽略它们。