什么是PHP-FPM? 如何更好的理解

我们之前还看到了PHP-FPM这个东西,那么究竟PHP-FPM是什么呢?PHP-FPM的官方网站解读是FastCGI进程管理,它代替了PHPFastCGI的绝大多数附加功能,针对高速运转的网站十分有用。该PHP-FPM默认设置监听为9000端口。


换句话说,PHP-FPM是FastCGI的1个实际实现,它给予了进程管理功能,当中包含master和worker系统进程,每当我们在环境构建时,可以通过命令来查看该系统进程。在这个过程中,master系统进程负责与Web服务器中间件进行通信,接收服务器中间按照FastCGI规则打包的用户请求,随后将这些请求转发给工人系统进程进行处理。工人系统进程主要负责后端动态地执行PHP代码,一旦处理完成,处理结果就反回到Web服务器,随后由Web服务器将结果发送至客户机。


例如,当用户访问http://127.0.0.1/index.php?当a=1&b=2时,如果Web目录是/var/www/html,则Web服务器中间件(例如Nginx)将请求转换成下面的key-value对:在PHP或PHP中,该数组实际上是$_SERVER数组的一部分。但是环境变量不仅仅用于填充$_SERVER数组,还可以告诉fpm:“我要执行的PHP文件是哪个”。


在得到Fastcgi的包之后,PHP-FPM进行详细分析,进而得到上述环境变量。PCSIPT_FILENAME的值所指向的PHP文件称为/var/www/html/index.php。但是,如果我们能控制PCSIPT_FILENAME的值,我们就不能让1个PHP-FPM在服务器上执行1个PHP文件。PHP-FPM未经授权访问漏洞几乎在这里也得到了回应。


PHP-FPM任意执行代码,在之前的文章中我们提到过Web服务器中间件将用户请求设置为环境变量,并出现1个“PCSIPT_FILENAME”:'/var/www/html/index.php”这样的键值对,这意味着PHP-FPM执行该文件,但是只有PHP-FPM可以控制该键值对的值,而PHP-FPM只能执行某个已存在的文件,无法执行某些恶意代码。PHP后来的PHP5.3.9添加了security.limit_extensions安全选项,使得只能控制PHP-FPM执行某些文件,如php、php3、php4、php5、php7,所以您必须找到已有的PHP文件,这也增加了攻击的难度。


分享: