言午月月鸟
编程,带娃以及思考人生
首页
编程
带娃
思考人生
编程画图秀
[追查] PHP返回内容前拼接了请求体内容
dingusxp
2494
## 问题描述 > 2021-08-31 晚上开始。运维告知了腾讯云服务出现一次网络抖动。随后半小时左右,陆续有系统开始告警。 > 初步追查,发现是php接入层系统(php-fpm)模式,有一定概率返回内容前会拼接请求体内容,导致返回的数据异常。 > 重启php-fpm后,暂时恢复。2021-09-01早上9点多,再次复发。此次重启先解决问题,并从nginx摘掉一台机器保留现场以便追查。 ## 追查过程 ### 定位 首先确认是 nginx 与 php-fpm 是谁出的问题? 通过```tcpdump -i any tcp -X port 9000```抓包,可以确认是 php-fpm 返回的内容异常,而 nginx 发送到 php的内容正常。(示例报文 略) 在 php文件入口 `public/index.php` ,直接打印并退出 `exit('xxx');` 。 概率性复现时,请求体内容输出在 xxx 之前。 ```text {"msg":"test"}xxx ``` 可以判断是php-fpm本身出了异常,而非代码问题。 ### 方案 网上搜索 "输出结果前面添加了请求体",找到文章: https://bugs.php.net/bug.php?id=80385 可以得到的信息: 1. 适用范围: 操作系统: centos ,ubuntu ; PHP版本: 7.1 - 7.4 ; 宿主:云服务器,docker容器; 2. 开始时间: 有人在bugs.php.net 上提交问题时间是 2020-11 ; 3. 漏洞影响: 极其严重。只要post body体里的php代码都会被执行! 4. 官方回应: 安全问题,php-fpm配置不严谨导致。 结合我们的情况,确实是 php-fpm 配置问题。运维为了扩容方便,取消了 php-fpm 对负载均衡来源ip的限制: ```Bash listen = 0.0.0.0:9000 ; Default Value: any ;listen.allowed_clients = 10.10.1.111 ;listen.allowed_clients = 10.10.1.112 ``` 这种配置,只要任何一台可以访问到 php-fpm 机器的服务器,都可以通过修改自身 nginx fastcgi 的配置(或者自行构造fastcgi协议的请求),来动态修改 php-fpm进程中的PHP配置项的值: (参考 [https://www.php.net/manual/en/install.fpm.configuration.php](https://www.php.net/manual/en/install.fpm.configuration.php) 中 Example #2) ```Bash fastcgi_param PHP_VALUE "auto_prepend_file=php://input"; fastcgi_param PHP_ADMIN_VALUE "allow_url_include=On"; ``` 请求负载均衡配置如上的域名,添加的body体会直接回显。而如果body体包含php标签,则会执行其中代码(非常危险!!!)。 ```PHP // /test.php
粤ICP备19051469号-1
Copyright©dingusxp.com - All Rights Reserved
Template by
OS Templates