我正在使用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。
答案 0 :(得分:3)
您不应该包含或评估用户提供的代码。
尝试过滤掉“安全”代码超出了Zend_Reflection
的范围。这不是预期的用法,并且不受框架支持。如果您希望对输入进行一些巫术令牌解析,请随意,但这不是Zend_Reflection
。
如果您真的想这样做,请查看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.
}
}