Stack社区。 p>
我在PHP中使用eval()函数,因此我的用户可以在我的网站中执行自己的代码(是的,我知道这是一个危险的功能,但这不是重点)。
我想存储在解释代码期间发生的所有PHP错误,有没有办法获取所有这些错误?我想获取并在我的数据库表中注册它们。
error_get_last只获取最后一个错误,但我想要所有错误。 请帮帮我。甚至可能吗?
答案 0 :(得分:1)
你不能使用eval()
,因为被证实的代码将在当前上下文中运行,这意味着被破坏的代码可以覆盖上下文中的所有变量。除了安全考虑因素之外,这可能会破坏功能。检查这个想象的例子:
$mode = 'execute'
// here comes a common code example, it will overwrite `$mode`
eval('
$mode = 'test';
if(....) { ...
');
// here comes your code again, will fail
switch ( $mode) {
...
}
您无法以这种方式跟踪错误。一种方法是使用set_error_handler()
注册一个自定义错误处理程序,它将错误存储到db。如果用户在其代码中使用该功能,这将有效,但会怎样?请查看以下示例:
set_error_handler('my_handler');
function my_handler($errno, $errstr, $errfile, $errline) {
db_save($errstr, ...);
}
eval('
$a = 1 / 0; // will trigger a warning
echo $b; // variable not defined
'
);
这样可行。但是如果有这样的恶意代码会出现问题:
eval('
restore_error_handler();
$a = 1 / 0; // will trigger a warning
echo $b; // variable not defined
'
);
使其他人可以在您的服务器上执行代码的常见解决方案是:
fopen()
等关键功能
答案 1 :(得分:0)
根据documentation,您不能:
如果评估代码中存在解析错误,
eval()
将返回FALSE
并继续执行以下代码。使用eval()
在set_error_handler()
中捕获解析错误无法。
编辑:您无法使用eval()
执行此操作,但您显然可以使用php_check_syntax
功能。您必须将代码写入文件以检查其语法。