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