session.upload_progress.enabled
session.upload_progress.enabled = 0 能挡住 PHP2Shell 吗?
只能挡住一部分。它只能阻断两个 CVE 之一中已证实的会话相关路径——而且前提是设置在正确的位置并重启。这是权宜之计,不是修复。
最后核实 2026-10-22
一句话回答
php.net 原话:“This blocks the confirmed session paths but not other variants.”(这能挡住已证实的会话路径,但挡不住其他变种。)它对 CVE-2026-109618 完全无效。这个临时办法在补丁发布前被广泛传播,而正式发布已经确认它从来都不完整。去升级 PHP。
这个设置是做什么的
启用上传进度(默认开启)时,PHP 会在 multipart 上传中查找一个特殊的表单字段,并在仍在解析请求的阶段把进度写入用户会话。PHP2Shell 中与会话相关的释放后使用和内存泄露,恰恰就发生在这个早于初始化的会话处理阶段——包括把堆内存泄露到 PHPSESSID Cookie 里,即使你的应用从未启动会话也会发生。
能挡住什么,挡不住什么
| 攻击路径 | 能挡住? |
|---|---|
| 已证实的会话上传进度路径(CVE-2026-109619) | 能 |
| 致命错误回溯路径(PHP 8.5) | 不能——还需设置 fatal_error_backtraces = 0 |
| 其他残留状态变种(CVE-2026-109619) | 不能 |
| 内存耗尽导致的损坏(CVE-2026-109618) | 不能——见 memory_limit / post_max_size |
1. 检查当前值
# What php.ini says (CLI and FPM can differ — check both)
php -i | grep session.upload_progress.enabled
php-fpm8.3 -i | grep session.upload_progress.enabled # adjust version
# Where the setting comes from
php --ini
grep -rn "upload_progress" /etc/php/ 2>/dev/null
# What the running site actually uses (FPM pool overrides are only visible here)
# <?php var_dump(ini_get('session.upload_progress.enabled'));2. 在真正生效的位置设置
| 位置 | 是否生效 | 原因 |
|---|---|---|
| php.ini / conf.d 附加配置 | 生效 | 在解析请求之前生效。 |
FPM 池 php_admin_flag / php_admin_value | 生效 | 按池生效,应用无法覆盖。 |
Apache 虚拟主机 / 服务器配置(php_admin_flag) | 生效 | 适用于 mod_php。 |
.user.ini | 不生效 | php.net:不要依赖它——它可能在请求解析之前还没生效。 |
.htaccess php_flag | 不推荐 | 按目录生效且可被覆盖;请用服务器配置。 |
代码里的 ini_set() | 不生效 | 它在请求解析完成之后才运行。 |
; php.ini or conf.d drop-in, e.g. /etc/php/8.3/fpm/conf.d/99-php2shell.ini
session.upload_progress.enabled = 0
; or per FPM pool (/etc/php/8.3/fpm/pool.d/www.conf)
php_admin_flag[session.upload_progress.enabled] = off
; or Apache + mod_php (vhost or server config, not .htaccess)
php_admin_flag session.upload_progress.enabled off3. 重启所有 worker
正在运行的 worker 在重启前会一直保留旧配置——还可能带着已经被破坏的状态。
sudo systemctl restart php8.3-fpm # every FPM version and pool you run
sudo systemctl restart apache2 # mod_php
sudo /scripts/restartsrv_apache_php_fpm # cPanel
sudo systemctl restart plesk-php83-fpm # Plesk, per handler常见问题
session.upload_progress.enabled = 0 能防住 PHP2Shell 吗?+
只能防住一部分。php.net 说它“能挡住已证实的会话路径,但挡不住其他变种”,对 CVE-2026-109618 完全无效。PHP 核心开发者 Gina Peter Banyard 表示:“the only mitigation is patching/upgrading PHP.”(唯一的缓解办法就是打补丁 / 升级 PHP。)
可以在 .user.ini 里或用 ini_set() 设置 session.upload_progress.enabled 吗?+
不行。上传进度处理发生在 PHP 解析请求的阶段,早于你的代码运行。php.net 要求使用 php.ini、FPM 池或在请求解析之前生效的服务器配置,并明确指出不要依赖 .user.ini 或 ini_set()。
关闭上传进度会让网站出问题吗?+
很少。它只影响基于 PHP 会话上传进度功能实现的进度条。大多数现代上传界面都是在浏览器端跟踪进度的。
打完补丁后需要重新打开吗?+
只有用得到才需要。php.net 建议:如果不使用,即使在已修复版本上也保持关闭。
相关页面
- 临时缓解暂时无法升级时的 PHP2Shell 缓解措施:memory_limit、post_max_size、上传进度、fatal_error_backtraces、cgroup 内存上限——各自能挡住什么、会带来什么副作用。
- 修复 / 打补丁PHP2Shell 分步修复:Ubuntu、Debian、Sury、RHEL、Remi、Alpine、Docker、cPanel EasyApache、Plesk、Homebrew、Windows,以及重启、验证和 PHP 8.1 及更早版本的出路。
- CVE-2026-109619CVE-2026-109619(PHP2Shell)详解:请求级全局变量残留与释放后使用(UAF)、内存泄露、PHP-FPM 暴露情况、CVSS 9.2、修复版本和缓解措施。