我正在编写一个在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.有什么东西我还在遗失吗?
我有一个带符号链接的文件系统结构,如下所示:
folder123
index.php
config.php -> symlink to shared/config.php
shared
config.php
Run Code Online (Sandbox Code Playgroud)
我在命令行上运行index.php,index.php包含config.php,它是某个其他文件夹中文件的符号链接.
如何从config.php脚本中了解index.php文件路径?所需的结果是"folder123"(以及它的完整路径),而不是"共享".所以,我不能使用__FILE__.
这适用于脚本,由浏览器运行(至少在我的情况下,它与folder123 - 基础目录相同):
$_SERVER['DOCUMENT_ROOT']
Run Code Online (Sandbox Code Playgroud)
我也需要命令行的东西.
看起来像
$_SERVER['PWD']
Run Code Online (Sandbox Code Playgroud)
是我需要的东西,但它没有记录,所以我觉得它不是一个可靠的方法.此外,您需要将其与SCRIPT_FILENAME组合以获得所需的结果 - PWD显示运行脚本的目录,而不是它的完整路径.
getcwd看起来很有前途,但它可以通过chdir改变 - 如果我找不到更好的选择,我会使用它.
我正在使用Symfony 2.1.3-DEV并尝试将表单转换为字符串(某种ID),然后在提交表单时从字符串返回实体.如果我使用食谱中给出的变换器,问题是一样的:http: //symfony.com/doc/master/cookbook/form/data_transformers.html
控制器代码:
$task = $entityManager->find('AcmeTaskBundle:Task', $id);
$form = $this->createForm(new TaskType(), $task); // so $task->issue is Issue object
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
表单的视图数据应该是Acme\TaskBundle\Entity\Issue类的实例,但是是(n)字符串.您可以通过将"data_class"选项设置为null或通过添加将(n)字符串转换为Acme\TaskBundle\Entity\Issue实例的视图转换器来避免此错误.
问题是,我已经有一个变换器,它转换为TO字符串.
来自Form.php
:
if (null !== $dataClass && !$viewData instanceof $dataClass) {
throw new FormException(
//...
);
}
Run Code Online (Sandbox Code Playgroud)
为什么$viewData
检查是data_class
参数的实例(或给定对象的猜测类型)?是不是视图数据应该是字符串/数组等?我错过了什么吗?