如何安全地包含一个与Zend_Reflection一起使用的文件?

时间:2010-01-18 19:36:22

标签: php zend-framework

我正在使用Zend_Reflection生成一个扩展格式的ctags集合,以便与我的文本编辑器一起使用。问题是您必须include要处理的任何文件。

Zend_Reflection_File的构造函数检查是否包含了您希望反映的文件,如果没有,则会引发异常:

// From Zend/Refection/File.php (94-97)
if (!$fileRealpath || !in_array($fileRealpath, get_included_files())) {
    require_once 'Zend/Reflection/Exception.php';
    throw new Zend_Reflection_Exception(
        'File ' . $file . ' must be required before it can be reflected');
} 

我只在我信任的代码上使用这种技术,但我想把它全部包装在一个脚本中供其他人使用。我担心的是,任何包含的文件可能将不安全的代码引入当前范围。例如,我不想包含以下内容:

<?php
// evil.php
shell_exec('rm -rf /');

我的第一个想法是使用safe_mode,但这是折旧的(并不像名称所暗示的那样安全)。

下一个想法是使用自定义的php.ini文件和disable_functions指令但是(除了safe_mode文档中列出的候选者之外)我无法确定我是否抓到了所有必要的功能。

最后我想知道是否有任何方法可以让PHP在沙盒中运行(各种各样) - 我想捕获反射信息,而不包含任何包含执行的全局代码一点都不

任何和所有的想法都赞赏。 TIA。

1 个答案:

答案 0 :(得分:3)

您不应该包含或评估用户提供的代码。

编辑:

尝试过滤掉“安全”代码超出了Zend_Reflection的范围。这不是预期的用法,并且不受框架支持。如果您希望对输入进行一些巫术令牌解析,请随意,但这不是Zend_Reflection

编辑2:

如果您真的想这样做,请查看token_get_alltoken_get_namelist of parser tokens

如果你看一下Zend_Reflection_File::_reflect方法,就可以了解你可以做些什么:

<?php
$tokens = token_get_all(file_get_contents('file.php'));
foreach ($tokens as $token) {
    if (is_array($token)) {
        $type = $token[0];
        $value = $token[1];
        $line = $token[2];
    }
    switch ($type) {
        case T_FUNCTION:
            if ($value == 'shell_exec') {
                throw Exception("WTF");
            }
        // etc.
    }
}