将所有错误存储在PHP中的eval()上

时间:2013-06-01 14:49:17

标签: eval fetch php

Stack社区。

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

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

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

2 个答案:

答案 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
'
);

解决方案

使其他人可以在您的服务器上执行代码的常见解决方案是:

  • 将用户代码存储到临时文件中
  • 在php.ini
  • 中禁用fopen()等关键功能
  • 通过php-cli执行临时php文件并向用户显示输出(和错误)
  • 如果在调用php-cli时将stdin与stdout分开,则可以解析错误消息并将其存储在数据库中

答案 1 :(得分:0)

根据documentation,您不能:

  

如果评估代码中存在解析错误,eval()将返回FALSE并继续执行以下代码。使用eval()set_error_handler()中捕获解析错误无法

编辑:您无法使用eval()执行此操作,但您显然可以使用php_check_syntax功能。您必须将代码写入文件以检查其语法。