如何禁用PHP中的'e'PREG_REPLACE_EVAL修饰符?

时间:2011-08-30 12:24:25

标签: php regex security

我想知道如何在PHP的正则表达式系统中禁用eval修饰符,例如。 preg_replace('/.*/e', $code, '.')。如果有人设法将狡猾的代码放到服务器上,那么它可以用来代替eval。我最近遇到了一个问题,来自woothemes的wordpress主题有一个安全漏洞,允许黑客上传后门服务器管理类型脚本。

我在php.ini中有这个:

disable_functions = eval

这可以防止可能造成的大部分伤害,但我想知道我是否可以做类似的事情以防止除call_user_func_array()之外的所有形式的'eval'?

4 个答案:

答案 0 :(得分:9)

Suhosin extensiondisable 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