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. 检查当前值

shell
# 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()不生效它在请求解析完成之后才运行。
config
; 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 off

3. 重启所有 worker

正在运行的 worker 在重启前会一直保留旧配置——还可能带着已经被破坏的状态。

shell
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 建议:如果不使用,即使在已修复版本上也保持关闭。

相关页面