【问题标题】:How can i prevent eval and other errors to 'die'?我怎样才能防止 eval 和其他错误“死”?
【发布时间】:2011-09-22 04:00:50
【问题描述】:

我已经创建了一个守护进程,就像一个 cron。

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

我的问题是,如果发生错误,我不想停止守护进程。 (我已经有一个看门狗,如果 status == 'error' 会重新启动守护进程,并且每次客户端请求某个页面时都会在我的 CMS/CMF 上触发看门狗)

为什么我不想要这个?
防止黑客尝试,更快地纠正错误,我不想制作一个插件,当错误发生时,它会向我发送电子邮件

对不起我的英语不好

编辑:

本站使用eval() 运行你的代码,试一试,你就会明白它的工作原理,我只是不知道如何:

http://writecodeonline.com/php/

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

【问题讨论】:

标签: php eval die


【解决方案1】:

eval() 的致命错误可以用 try/catch 捕获 - 它在 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.
}

问候

【讨论】:

    【解决方案2】:

    解决你的“破坏程序”问题并不难。

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

    $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() 提供代码,除非您是这样骑的。)

    【讨论】:

      【解决方案3】:

      来自evaldocumentation

      无法捕获解析 eval() 中的错误使用 set_error_handler()

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

      【讨论】:

      • @CuSS - 不是根据文档,但我已经更新了我的答案,链接到所谓的“防弹”eval。从外观上看,它应该适合你。
      • 这个网站可以做到:writecodeonline.com/php,如果你输入eval(),它会改变代码。
      • @CuSS - 该网站接受用户输入,它被编程为将 eval( 更改为 EVAL_DISABLED。它最喜欢使用 exec() 或 passthru() 来执行 PHP(或者可能类似于我的示例链接到上面)。
      猜你喜欢
      • 2011-12-05
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-05
      • 2021-12-21
      相关资源
      最近更新 更多