如何防止eval和其他错误“死亡”?

时间:2011-06-24 16:00:53

标签: php eval die

我做了一个像守护进程的守护进程。

该守护进程将在所有模块页面中搜索名为“modulename.cron.php”的文件,并通过eval()执行它们。

我的问题是,如果发生一些错误,我不会停止守护进程。 (如果状态=='错误',我已经有一个看门狗重启守护进程,每次客户端请求某个页面时,我的CMS / CMF都会触发监视程序)

为什么我不这样做?
防止破解尝试,更快地纠正错误,我不想制作插件,当发生错误时,它会向我发送电子邮件

抱歉我的英文不好

修改

此网站使用eval()来运行您的代码,尝试它并且您将了解它的工作原理,我只是不知道如何:

http://writecodeonline.com/php/

我已经尝试了@eval($code) OR error_handler_function_here($code)但它不起作用!

3 个答案:

答案 0 :(得分:2)

来自eval documentation

  

无法捕获解析   使用eval()时出错   的set_error_han dler()

在同一页面的评论中有一个关于“防弹”评估的建议。看看http://www.php.net/manual/en/function.eval.php#103360

答案 1 :(得分:0)

解决“打破程序”问题并不困难。

首先将代码作为测试运行...即

$file='/tmp/'.rand(0,99999);
/*private eyes*/
touch($file);
chmod($file,600);
/*save to a temp file*/
$fp=fopen($file,'w');
fwrite($fp,'<?php eval("'.str_replace('"',"\\\"",$code).'");?>');
fclose($fp);
/* redirect stderr to stdout and execute */
$result=`php -q $file 2>&1`;
unlink($file);
if (stristr($result,'fatal')) {
 /* no breaky */
 echo 'If I run that code it may will maybe possibly definitely cause me to break.';
} else {
 /* ok, probably */
 echo eval($code);
}

(但你可能不应该从非本地用户向eval()提供代码,除非你骑的方式。)

答案 2 :(得分:-1)

可以通过try / catch捕获eval()的致命错误-(至少)在php 7.x上可以正常工作,但我没有在较早的版本上对其进行过测试。

try {
    eval($code);
} catch (Throwable $error) {
    // do some stuff with the Throwable, contains also fatal errors like
    // ParseError: syntax error, unexpected end of file etc.
}

问候