相关疑难解决方法(0)

如何使用PHP的各种XML库来获取类似DOM的功能并避免DoS漏洞,比如Billion Laughs或Quadratic Blowup?

我正在编写一个在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 security doctype denial-of-service xml-parsing

11
推荐指数
2
解决办法
2575
查看次数

外部实体在 simplexml 中不起作用

我在 PHP 5 中使用 SimpleXML 解析 XML,但外部实体不起作用。XML 解析,但实体只是空白。底层库是 libxml2。

这是代码:

libxml_disable_entity_loader(false);
simplexml_load_file($target_file);
Run Code Online (Sandbox Code Playgroud)

它按预期解析 XML,但不解析外部实体并且似乎忽略它们。

php xml

5
推荐指数
1
解决办法
4631
查看次数

标签 统计

php ×2

denial-of-service ×1

doctype ×1

security ×1

xml ×1

xml-parsing ×1