我想知道如何在PHP的正则表达式系统中禁用eval修饰符,例如。 preg_replace('/.*/e', $code, '.')
。如果有人设法将狡猾的代码放到服务器上,那么它可以用来代替eval。我最近遇到了一个问题,来自woothemes的wordpress主题有一个安全漏洞,允许黑客上传后门服务器管理类型脚本。
我在我的php.ini中有这个:
disable_functions = eval
这可以防止大部分可能造成的伤害,但我想知道我是否可以做类似的事情,以防止所有形式的'eval'除了 call_user_func_array()
东东?
该 Suhosin扩展 提供了一个选项 禁用 /e
修改。
disable_functions = eval
顺便说一句,不会做你期望的事情 eval
不是一个函数,而是一个语言结构)。 Suhosin扩展再次提供了一个选项 禁用 eval
。
找到并替换? :)
不,您无法禁用特定功能的特定功能。
但是,您可以做的是保持服务器的更新和保护。您可以尝试在chroot中运行apache进程,限制使用的资源,安装防火墙等等......您可以找到许多有关如何在网络上保护Linux安装的教程。
我发现这些与wordpress相关,似乎是一堆理智的提示:
该 Suhosin扩展 提供了一个选项 禁用 /e
修改。
disable_functions = eval
顺便说一句,不会做你期望的事情 eval
不是一个函数,而是一个语言结构)。 Suhosin扩展再次提供了一个选项 禁用 eval
。
找到并替换? :)
不,您无法禁用特定功能的特定功能。
但是,您可以做的是保持服务器的更新和保护。您可以尝试在chroot中运行apache进程,限制使用的资源,安装防火墙等等......您可以找到许多有关如何在网络上保护Linux安装的教程。
我发现这些与wordpress相关,似乎是一堆理智的提示:
要从正则表达式中删除修饰符“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
Diseval PHP扩展还将禁用php5和php7中的/ e修饰符,同时禁用eval:
https://github.com/mk-j/PHP_diseval_extension