Как БЕЗОПАСНО включить файл для использования с Zend_Reflection? - PullRequest
2 голосов
/ 18 января 2010

Я использую 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, но это не рекомендуется (а не как safe , как следует из названияпредлагаю, кажется).

Следующей идеей будет использование пользовательского файла php.ini и директивы disable_functions, но (кроме кандидатов, перечисленных в документации safe_mode), я не был уверен, что поймал всенеобходимые функции.

Наконец, мне интересно, есть ли способ заставить PHP работать в «песочнице» (своего рода) - я бы хотел получить информацию об Reflection без какого-либо включенного глобального кодавыполняется на всех.

Любые мысли приветствуются.ТИА.

1 Ответ

3 голосов
/ 18 января 2010

Вы не должны включать или вводить код, предоставленный пользователем.

Edit:

Попытка отфильтровать «безопасный» код выходит за рамки Zend_Reflection. Это не предполагаемое использование и не поддерживается платформой. Если вы хотите выполнить какой-то анализ токена вуду на своем входе, не стесняйтесь, но это не Zend_Reflection.

Редактировать 2:

Если вы действительно хотите это сделать, посмотрите token_get_all , token_get_name и список токенов парсера .

Если вы посмотрите на метод 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.
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...