Как отключить модификатор '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()
?
Ответы
Ответ 1
Расширение Suhosin предоставляет возможность отключить модификатор /e
.
disable_functions = eval
кстати не будет делать то, что вы ожидаете (поскольку eval
не функция, а языковая конструкция). Опять же расширение Suhosin предоставляет возможность отключить eval
.
Ответ 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