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


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

我在我的php.ini中有这个:

disable_functions = eval

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


1174
2017-08-30 12:24


起源



答案:


Suhosin扩展 提供了一个选项 禁用 /e 修改

disable_functions = eval 顺便说一句,不会做你期望的事情 eval 不是一个函数,而是一个语言结构)。 Suhosin扩展再次提供了一个选项 禁用 eval


9
2018-02-04 22:20





找到并替换? :)

不,您无法禁用特定功能的特定功能。

但是,您可以做的是保持服务器的更新和保护。您可以尝试在chroot中运行apache进程,限制使用的资源,安装防火墙等等......您可以找到许多有关如何在网络上保护Linux安装的教程。

我发现这些与wordpress相关,似乎是一堆理智的提示:


2
2017-08-30 12:40



干杯。它不是一般的apache或服务器设置,而是客户端使用的具有安全漏洞的特定主题。如果它无法关闭,那么就不需要修补主题了。 - roborourke
尝试更新所有已安装的软件。所有软件都以某种方式包含某种错误...如果您想要某种真正安全的环境,请查看chroot或某种虚拟化技术,以使您的真实服务器与客户端的软件分离 - Quamis


答案:


Suhosin扩展 提供了一个选项 禁用 /e 修改

disable_functions = eval 顺便说一句,不会做你期望的事情 eval 不是一个函数,而是一个语言结构)。 Suhosin扩展再次提供了一个选项 禁用 eval


9
2018-02-04 22:20





找到并替换? :)

不,您无法禁用特定功能的特定功能。

但是,您可以做的是保持服务器的更新和保护。您可以尝试在chroot中运行apache进程,限制使用的资源,安装防火墙等等......您可以找到许多有关如何在网络上保护Linux安装的教程。

我发现这些与wordpress相关,似乎是一堆理智的提示:


2
2017-08-30 12:40



干杯。它不是一般的apache或服务器设置,而是客户端使用的具有安全漏洞的特定主题。如果它无法关闭,那么就不需要修补主题了。 - roborourke
尝试更新所有已安装的软件。所有软件都以某种方式包含某种错误...如果您想要某种真正安全的环境,请查看chroot或某种虚拟化技术,以使您的真实服务器与客户端的软件分离 - Quamis


要从正则表达式中删除修饰符“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

2
2018-04-03 15:07





Diseval PHP扩展还将禁用php5和php7中的/ e修饰符,同时禁用eval: https://github.com/mk-j/PHP_diseval_extension


0
2017-10-26 15:53