Чтобы отключить session upload progress в PHP, установите session.upload_progress.enabled=0 в конфигурации, которую PHP применяет при запуске (php.ini, пул FPM или конфигурация сервера), сделайте этот параметр недоступным для переопределения, а затем перезапустите все воркеры PHP. Проект PHP рекомендует это для всех серверов, которые не используют данную функцию, после того как октябрьские уязвимости PHP2Shell показали, что ее можно использовать для получения удаленного выполнения кода.
Что такое session upload progress в PHP?
Session upload progress — это функция PHP, которая записывает информацию о том, какая часть файла уже загружена в сессию пользователя, чтобы страница могла отображать индикатор выполнения. Она существует с PHP 5.4.0 и включена по умолчанию.
Лишь немногие современные приложения используют ее. Большинство индикаторов выполнения загрузки создаются на JavaScript в браузере, поэтому на многих серверах функция включена, но ничего от нее не зависит.
Почему стоит отключить session upload progress в PHP?
В бюллетене безопасности PHP для CVE-2026–109619 функция session upload progress указана как один из подтвержденных путей к выполнению кода, в том числе на обычном пуле PHP-FPM. Вторая проблема с более низким уровнем риска, опубликованная 23 октября 2026 года (CVE-2026–115560), также затрагивает эту функцию, и PHP снова рекомендует отключать ее до следующего регулярного релиза.
В рекомендациях также отмечается: если функция вам не нужна, держите ее отключенной даже после установки патча. Отключение сокращает поверхность атаки, ничего не ломая на большинстве сайтов.
Само по себе отключение не является полноценным исправлением. В бюллетенях указано, что единственным полным решением является обновление до версий 8.5.12, 8.4.27, 8.3.36 или 8.2.35. Рассматривайте эту настройку как дополнительный уровень защиты поверх обновления.
Проверьте, использует ли кто-нибудь эту функцию
Прежде чем менять настройку, убедитесь, что от нее ничего не зависит.
- Выполните поиск по коду приложения и плагинам на наличие названий настроек session upload progress, префиксов, а также ключа сессии, в который функция записывает данные. Если на них нет ссылок, данные никто не читает.
- Спросите владельца или разработчика приложения, зависят ли их экраны загрузки от серверного прогресса. Обычно с этим сталкиваются при использовании крупных файловых менеджеров и некоторых старых плагинов для CMS.
- Протестируйте загрузку на стейджинг-сервере с отключенной функцией. Загрузка файлов продолжит работать; исчезнут только данные о прогрессе на стороне сервера.
Где прописать директиву
В рекомендациях PHP указано, что настройку нужно задавать «административно», то есть там, где приложения не смогут ее переопределить. На практике:
- php.ini: добавьте директиву в основной файл php.ini (или в файл в директории conf.d, который он загружает) для каждой версии PHP и SAPI на хосте. Дистрибутивы обычно хранят отдельные файлы php.ini для CLI, Apache и FPM, поэтому изменение одного не затрагивает другие.
- Пулы PHP-FPM: задайте ее с помощью php_admin_flag или php_admin_value в файле каждого пула. Административные значения нельзя изменить через функции ini_set() или файл .user.ini.
- Apache mod_php : задайте ее с помощью php_admin_flag в конфигурации сервера или виртуального хоста, а не с помощью php_flag в файле .htaccess, который владелец сайта может изменить.
- Контейнеры: зашейте настройку в конфигурацию PHP внутри образа и пересоберите его. Изменения в работающем контейнере будут потеряны при следующем деплое.
Сама директива представляет собой одну строку:
session.upload_progress.enabled=0
Перезапустите каждый воркер
PHP считывает настройки при запуске процесса воркера, поэтому изменение не вступит в силу до перезапуска воркеров. В бюллетене прямо указано: перезапустите каждый воркер.
- Для PHP-FPM перезапустите (а не просто сделайте reload) каждый сервис FPM — по одному для каждой версии PHP, если у вас их несколько.
- Для mod_php перезапустите Apache.
- При использовании управляемого хостинга или панели управления воспользуйтесь функцией перезапуска PHP от провайдера либо создайте тикет в поддержку.
- Для контейнеров выполните повторный деплой, чтобы каждый реплэйк заなどл новый образ.
Как убедиться, что настройка вступила в силу?
Проверяйте значение, которое сообщает работающий веб-SAPI, а не командная строка, поскольку CLI часто считывает другой файл php.ini. Страница phpinfo, доступная только администратору, или проверка PHP вашим инструментом мониторинга покажет актуальное значение для каждого сайта.
Повторите проверку для каждого пула и каждого виртуального хоста. Частая ошибка — оставить старую версию PHP на том же сервере для какого-нибудь устаревшего сайта, где настройки остались по умолчанию.
Закрепите результат
Внесите эту настройку в систему управления конфигурацией или в процесс сборки образа (а не только на «живой» сервер), чтобы пересборка случайно не вернула значения по умолчанию. Добавьте периодическую проверку, которая будет отправлять уведомления, если какой-либо PHP-эндпоинт сообщит, что функция включена.
Эта настройка дополняет выбор SAPI, описанный в статье mod_php против PHP-FPM: почему SAPI влияет на уровень риска. О серверах, застрявших на старых ветках, которые могут не получить полноценного патча, рассказано в материале почему устаревшим версиям PHP нужен план вывода из эксплуатации. Если при изучении логов вы обнаружите признаки взлома, сначала сохраните их, руководствуясь инструкцией как сохранить следы взлома перед патчем сервера.
Оригинал статьи опубликован на https://www.anthonybahn.com/learn/disable-php-session-upload-progress/
Бесплатная памятка по безопасности (AMB Digital Group)
Больше материалов читайте на anthonybahn.com и в блоге AMB Digital Group на Substack
Комментарии (0)
Пока нет комментариев — будьте первым.