Как я могу предотвратить eval и другие ошибки, чтобы «умереть»? - PullRequest
1 голос
/ 24 июня 2011

Я сделал демона, действующего как cron.

Этот демон будет искать на всех страницах модулей файл с именем 'modulename.cron.php' и выполнять их через eval().

Моя проблема в том, что если произойдет какая-либо ошибка, я не остановлю демона.(У меня уже есть сторожевой таймер, который перезапускает демона, если состояние == 'ошибка', и сторожевой таймер срабатывает на моей CMS / CMF каждый раз, когда клиент запрашивает какую-либо страницу)

Почему я хочуне так ли?
Предотвращение попыток взлома, исправление ошибок быстрее, и я не хочу создавать плагин, который при возникновении ошибки отправляет мне электронное письмо

Извините за мой плохой английский

РЕДАКТИРОВАТЬ:

Этот сайт использует eval() для запуска вашего кода, попробуйте его, и вы поймете, что он работает, я просто не знаю, как:

http://writecodeonline.com/php/

Я уже попробовал @eval($code) OR error_handler_function_here($code), но это не работает!

Ответы [ 3 ]

2 голосов
/ 24 июня 2011

Из документации eval

Невозможно отловить ошибку анализа в eval () с помощью set_error_handler ()

В комментариях на той же странице есть предложение о «пуленепробиваемом» eval.Посмотрите на http://www.php.net/manual/en/function.eval.php#103360.

0 голосов
/ 06 сентября 2018

Фатальные ошибки 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.
}

Привет

0 голосов
/ 07 марта 2014

Решить проблему «взлома программы» несложно.

Сначала запустите код в качестве теста ... т.е.

$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 () от нелокального пользователя, если только вы не едете.)

...