一、最近的 PHP 漏洞是什么?
CVE-2026-109618
严重
2026 年 10 月 21 日发布
内存耗尽处理漏洞,可导致远程代码执行。
攻击者可能通过特制 HTTP 请求触发 PHP 内存处理异常,进而执行服务器上的恶意代码。
CVE-2026-109619
严重
2026 年 10 月 21 日发布
过期内存状态漏洞,可导致远程代码执行。
PHP 工作进程可能继续使用前一个请求遗留的无效状态,攻击者在特定条件下可以利用该问题执行恶意代码。
官方已经为受支持的版本发布修复版:
|---------|--------|
| PHP 分支 | 修复版本 |
| PHP 8.5 | 8.5.12 |
| PHP 8.4 | 8.4.27 |
| PHP 8.3 | 8.3.36 |
| PHP 8.2 | 8.2.35 |
二、PHP 怎么修复?按优先级处理
方案一:升级 PHP(推荐,彻底解决的方向)
如果这是运行多年的老项目,不建议直接将线上 PHP替换成 PHP 8.x。旧项目可能存在语法、函数、数据库驱动和第三方扩展兼容性问题。
建议按以下步骤实施:
-
备份网站代码、数据库、
php.ini、Apache/Nginx 配置和扩展清单。 -
在测试环境部署 PHP 8.4 或 8.5 的修复版本,尽可能与旧环境并行运行。
-
检查旧代码的兼容问题,测试登录、数据库查询、文件上传、支付、定时任务等功能。
-
测试通过后切换线上 PHP 运行环境,并确认 Web 实际使用的版本已经升级。
-
完成漏洞扫描和日志检查。
我更建议把 PHP 8.4.27 或更高的 8.4 安全更新版作为老项目的迁移目标之一;PHP 8.5 也可以,但具体取决于项目及扩展的兼容情况。不要把已经停止支持的 PHP 7.4、8.0 当作最终安全修复版本。
方案二:短期不能升级,先做临时防护
以下措施用于降低风险,不能代替升级 PHP。
|----------|--------------------------------------------------------------------------|
| 处理措施 | 具体做法 |
| 限制公网访问 | 对后台、管理接口优先设置 IP 白名单、VPN 或访问控制 |
| 限制上传请求 | 在 Nginx/Apache 入口限制请求体大小;如果业务不使用文件上传,可考虑直接拦截 multipart 请求 |
| 关闭上传进度功能 | 在适用环境的 php.ini 管理配置中设置 session.upload_progress.enabled = Off,然后重启 PHP 服务 |
| 增加前端防护 | 使用 WAF、请求频率限制和异常请求拦截 |
| 排查入侵情况 | 检查近期新增的 PHP 文件、异常文件修改、可疑上传和异常请求日志 |
PHP 官方针对最新漏洞明确指出:禁用 session.upload_progress 只能缓解其中一条利用路径,不是完整修复。官方对内存耗尽漏洞还提出了 memory_limit=-1 这一临时配置缓解措施,但它会取消 PHP 自身的内存限制,可能导致内存消耗失控,不建议未经评估就直接在生产环境设置。
如果网站正在处理敏感业务、无法及时升级且直接暴露在公网,优先临时限制外部访问,必要时将网站隔离,直至完成修复。
三、处理方案
一、修改php配置
/usr/local/php/etc/php-fpm.conf(找到自己的php-fpm.conf的位置)
[www]
listen = /tmp/php-cgi.sock
listen.backlog = -1
listen.allowed_clients = 127.0.0.1
listen.owner = www
listen.group = www
listen.mode = 0660
; 临时缓解措施:关闭 Session 上传进度功能
php_admin_flag[session.upload_progress.enabled] = off
两处改动分别是:
|--------------------|------------------------------------------------------------|
| 原配置 | 修改后 |
| listen.mode = 0666 | listen.mode = 0660 |
| 没有上传进度限制 | 增加 php_admin_flagsession.upload_progress.enabled = off |
/usr/local/php/etc/php.ini (找到自己的php.ini的位置)
调整下面四个的参数
session.upload_progress.enabled = Off
memory_limit = 128M
post_max_size = 8M
upload_max_filesize = 4M
重启php命令
重新加载(替换成自己的命令)
/etc/init.d/php-fpm reload
重新启动(替换成自己的命令)
/etc/init.d/php-fpm restart
nginx
调整的代码
# 安全加固:该站点不需要大文件上传 这个可以配置在nginx的http模块里面
# 无大文件上传需求的示例
client_max_body_size 8m;
# 限制客户端发送请求头和请求体时的空闲等待
client_header_timeout 15s;
client_body_timeout 30s;
#如果网站不需要上传文件 该网站不接受 multipart 文件上传 这个只能配置在server模块里面
if ($http_content_type ~* "multipart/form-data") {
return 403;
}
重启命令
检查nginx配置文件(替换自己的命令)
/usr/local/nginx/sbin/nginx -t
重新加载(替换自己的命令)
/usr/local/nginx/sbin/nginx -s reload
重启
/etc/init.d/nginx restart