堆栈社区。
我在 PHP 中使用 eval() 函数,所以我的用户可以在我的网站上执行他自己的代码(是的,我知道这是一个危险的函数,但这不是重点)。
我想存储在解释代码期间发生的所有 PHP 错误,有没有办法获取所有这些错误?我想在我的数据库表中获取并注册它们。
error_get_last 只获取最后一个错误,但我想要所有这些。请帮帮我。甚至有可能吗?
您不能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()
在 php.ini 中禁用诸如 ... 之类的关键功能根据文档,您不能:
如果评估代码中存在解析错误,则
eval()
返回FALSE
并正常继续执行以下代码。在使用. _ _eval()
set_error_handler()
编辑:你不能用 来做eval()
,但你显然可以用php_check_syntax
功能。您必须将代码写入文件才能检查其语法。