Как отключить модификатор 'e' PREG_REPLACE_EVAL в PHP?

Я хочу знать, как отключить модификатор eval в системе PHP regex, например. preg_replace('/.*/e', $code, '.'). Это потенциальный эксплойт, который можно использовать вместо eval, если кому-то удастся получить изворотливый код на сервере. Недавно у меня возникла проблема с темой wordpress из woothemes, в которой была дыра в безопасности, которая позволяла хакерам загружать тип администратора сервера back door script.

У меня это в моем php.ini:

disable_functions = eval

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

Ответ 2

найти и заменить?:)

Нет, вы не можете отключить определенную функциональность определенной функции.

Однако вы можете сохранить обновленный и защищенный сервер. Вы можете попытаться запустить процесс apache в chroot, ограничить используемые ресурсы, установить брандмауэр и т.д.... вы можете найти множество руководств о том, как защитить вашу установку linux в сети.

Я нашел, что они связаны с wordpress, похоже на кучу разумных советов:

Ответ 3

Чтобы удалить модификатор "e" из регулярных выражений (например, если пользователь имеет доступ к установке регулярных выражений в приложениях), я написал функцию, чтобы вырезать модификатор "e" из любого шаблона регулярного выражения.

function remove_emodifier($pattern)
{
    $pattern_parts = explode($pattern{0}, trim($pattern));
    $pattern_last = sizeof($pattern_parts) - 1;
    $pattern_parts[$pattern_last] = str_replace('e', '', $pattern_parts[$pattern_last]);

    return implode($pattern{0}, $pattern_parts);
}

echo preg_replace('/^(.*)$/iex', 'strrev("\\1")', 'my_string'); // gnirts_ym
echo preg_replace(remove_emodifier('/^(.*)$/iex'), 'strrev("\\1")', 'my_string'); // strrev("my_string")

echo remove_emodifier('|abc|eix'); // |abc|ix
echo remove_emodifier('#.+(\d+)#iseU'); // #.+(\d+)#isU

Ответ 4

Расширение Diseval PHP также отключит модификатор /e как в php5, так и php7, в то же время отключив eval: https://github.com/mk-j/PHP_diseval_extension