代码之家  ›  专栏  ›  技术社区  ›  Carlton Gibson

如何安全地包含与zend_反射一起使用的文件?

  •  2
  • Carlton Gibson  · 技术社区  · 15 年前

    我正在使用zend_反射生成一个ctag的扩展格式集,以便与我的文本编辑器一起使用。问题是你必须 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 但是(除了 安全模式 文档)我不能确定是否已经捕获了所有必需的函数。

    最后,我想知道是否有任何方法可以让php在沙箱中运行(类似的)——我想捕获反射信息而不需要任何 全球的 包括正在执行的代码。

    所有的想法都值得欣赏。 短暂性脑缺血发作

    1 回复  |  直到 15 年前
        1
  •  3
  •   hobodave    15 年前

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

    编辑:

    试图筛选出“安全”代码超出了 Zend_Reflection . 这不是预期的用途,并且不受框架支持。如果你想对你的输入做一些巫毒标记解析,请放心,但那不是 Zend_u反射 .

    编辑2:

    如果你真的想这么做,请看 token_get_all , token_get_name ,以及 list 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.
        }
    }