1

堆栈社区。

我在 PHP 中使用 eval() 函数,所以我的用户可以在我的网站上执行他自己的代码(是的,我知道这是一个危险的函数,但这不是重点)。

我想存储在解释代码期间发生的所有 PHP 错误,有没有办法获取所有这些错误?我想在我的数据库表中获取并注册它们。

error_get_last 只获取最后一个错误,但我想要所有这些。请帮帮我。甚至有可能吗?

4

2 回答 2

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()在 php.ini 中禁用诸如 ... 之类的关键功能
  • 通过 php-cli 执行临时 php 文件并向用户显示输出(和错误)
  • 如果在调用 php-cli 时将 stdin 与 stdout 分开,则可以解析错误消息并将它们存储在数据库中
于 2013-06-01T17:02:08.033 回答
0

根据文档,您不能:

如果评估代码中存在解析错误,则eval()返回FALSE并正常继续执行以下代码。在使用. _ _eval()set_error_handler()

编辑:你不能用 来做eval(),但你显然可以用php_check_syntax功能。您必须将代码写入文件才能检查其语法。

于 2013-06-01T15:03:36.437 回答