小编Mar*_*tis的帖子

如何使用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
查看次数

知道php命令行脚本路径的可靠方法是什么?

我有一个带符号链接的文件系统结构,如下所示:

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改变 - 如果我找不到更好的选择,我会使用它.

php command-line

4
推荐指数
1
解决办法
5021
查看次数

Symfony2表单实体到字符串变换器问题

我正在使用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参数的实例(或给定对象的猜测类型)?是不是视图数据应该是字符串/数组等?我错过了什么吗?

symfony-forms symfony symfony-2.1

3
推荐指数
1
解决办法
5490
查看次数