Накратко: Официалният PHP образ в Docker Hub съществува в много тагове, които комбинират версия, вариант (например cli, fpm, apache) и базова система. Тагът е указател, който след ново изграждане се премества към нови състояния; само digest означава точно едно състояние. Срещу PHP2Shell Ви трябва образ с PHP 8.5.12, 8.4.27, 8.3.36 или 8.2.35, проверен с php -v, и ново изграждане на Вашите собствени образи върху него.
Защо тагът сам по себе си казва малко
Много екипи пишат в своя Dockerfile ред като FROM php:8.3-fpm и после го забравят. Това работи, докато никой не пита коя версия на PHP всъщност работи. След PHP2Shell всеки пита.
Отговорът не стои в Dockerfile. Таг като 8.3-fpm към момента на изтеглянето сочи към най-новото състояние на този клон. Ако образът е изтеглен преди 21 октомври и оттогава не е обновяван, той съдържа уязвима версия, въпреки че тагът днес сочи към отстранено състояние. Според насоките на Docker Official Images образите се изграждат активно наново, и при поправки за сигурност. Вашето локално състояние обаче не се засяга от това.
Пълният ход от новото изграждане до новосъздадения контейнер описва Пачване на PHP в Docker контейнери. Тук става дума за предварителния въпрос: кой образ е правилният и как да докажете състоянието му?
Тагове на PHP Docker образи: как са устроени
Таговете се състоят от най-много три части. Docker Hub показва примери като php:8.2-cli, php:8.2-fpm-alpine или php:8.4.27-zts-alpine3.24.
| Съставна част | Пример | Значение |
|---|---|---|
| Указание за версия | 8.4.27 или 8.4 |
пълната версия остава при това състояние, указанието за клон се премества с новите пачове |
| Вариант | cli, fpm, apache, zts |
режим на работа на PHP в контейнера |
| Базова система | alpine3.24, bookworm, trixie |
основна версия на Alpine или Debian |
Вариантите не са равнозначни за PHP2Shell. fpm управлява PHP-FPM, apache управлява PHP като Apache модул, тоест mod_php. Този режим на работа екипът на PHP оценява най-високо, защото там е показан експлойт, преди изобщо да се изпълни код на приложението. Повече по темата има в Защо mod_php е особено застрашен. Вариантът cli е предвиден за задачи от командния ред.
И базовата система има последици. Образите Alpine са малки, но ползват друга C библиотека от образите Debian; някои разширения или предварително компилирани библиотеки се държат там различно. Затова не сменяйте базовата система между другото с актуализацията за сигурност, а първо останете при онова, което Вашето приложение познава.
Важно за разбирането: в официалния образ PHP не идва от пакетите на базовата дистрибуция. Docker Hub описва, че изходният код на PHP стои в образа, а разширенията се вграждат чрез помощни скриптове като docker-php-ext-install. Актуализация на пакетите на базовата система във Вашия собствен Dockerfile затова не променя нищо във версията на PHP. Меродавно е единствено върху кое състояние на официалния образ надграждате.
Таг или digest: какво се променя и кога
Digest е контролна сума върху съдържанието на образ, записана като sha256: с дълга поредица от знаци. Той се променя с всяко ново изграждане. Затова е подходящ като доказателство: който знае digest, знае точно кое състояние работи.
На практика се доказва разпределение на ролите:
- В Dockerfile ползвайте тага на клона, например
php:8.4-fpm, за да получи новото изграждане автоматично най-новия пач на този клон. - При разполагането ползвайте digest на готовия собствен образ, за да е еднозначно какво се доставя.
- В документацията запишете и двете: таг, digest и версията, проверена с
php -v.
Който вместо това фиксира пълен версионен таг като 8.3.35-fpm, никога не получава автоматично пач. Това може да е желано, но изисква процес, който повишава тага при всяко съобщение за сигурност.
PHP2Shell: проверка на образ преди употреба
Следните команди теглят образ и четат информация. Те не променят работещи контейнери.
# Изтегляне на текущото състояние на тага на клона
docker pull php:8.4-fpm
# Коя версия на PHP се съдържа в образа?
docker run --rm php:8.4-fpm php -v
# Показване на digest на изтегления образ
docker image inspect php:8.4-fpm --format '{{index .RepoDigests 0}}'
# Запитване за digest и платформи директно в регистъра
docker buildx imagetools inspect php:8.4-fpm
Заявката с imagetools показва при мултиплатформени образи обобщаващ digest, а под него за всяка платформа, например linux/amd64 или linux/arm64, собствен. Документирайте digest, който Вашите сървъри наистина теглят, и имайте предвид, че компютри на разработчици с друга архитектура получават друг digest на платформа.
Ако php -v не показва поне отстранената версия на клона, образът е остарял или идва от междинна памет. Тогава проверете дали средата Ви ползва огледало на регистъра, което доставя стари състояния.
За PHP 8.1 и по-стари проектът PHP не издава официални релийзи. Официален образ на тези клонове затова не може да съдържа редовна отстранена версия. Тагове, които вече не се поддържат, според насоките на Docker остават достъпни, но вече не се обновяват.
Според Docker Hub образът носи php.ini-development и php.ini-production и настоятелно препоръчва за продуктивна работа производствената версия. Собствените си настройки, включително преходните стойности от php.net, записвайте като файл в $PHP_INI_DIR/conf.d/.
Типични грешки при избора на образ
- Вариант по навик: Вариантът apache се избира, защото стартира лесно, макар че fpm с отделен уеб сървър би бил възможен.
- Липса на ново изграждане на собствените образи: Базовият образ е актуален, а изграденият от него образ на приложението - не.
- Пренебрегнати многостъпални build-ове: В Dockerfile с няколко реда
FROMсе коригира само един. - Забравени странични образи: Worker-ите, cron контейнерите и административните инструменти ползват собствени тагове.
- Разчитане само на
latest: Тагът не казва нищо за клона и варианта и при нов основен клон може да скочи неочаквано.
Как да автоматизирате новите изграждания, за да не работи остарял образ дълго, описва CI/CD: автоматично ново изграждане на PHP образи. Основите за PHP в контейнери обяснява PHP в контейнери.
Как помага PHP SOS конкретно?
- Проверка на наличното: Извличаме кои тагове, digest-и и версии на PHP стоят във Вашите образи и работещи контейнери.
- Оценка на варианта: Проверяваме дали mod_php е необходим, или fpm с отделен уеб сървър намалява риска.
- Ново изграждане и доказване: С PHP Patch Service изграждаме образите наново върху отстранена основа и документираме таг, digest и версия.
- Закрепване на процеса: Настройваме Dockerfile и разполагания така, че следващият пач да пристигне планирано.
Често задавани въпроси
Каква е разликата между таг и digest?
Таг като php:8.4-fpm е име, което след всяко ново изграждане може да сочи към ново състояние. Digest е контролна сума, която означава точно едно непроменяемо състояние. За доказателства и възпроизводими разполагания digest е по-надеждният показател.
Кой таг съдържа поправката за PHP2Shell?
Отстранени са PHP 8.5.12, 8.4.27, 8.3.36 и 8.2.35. Таг с пълен номер на версията показва състоянието директно. При по-кратки тагове като 8.4-fpm след изтеглянето проверете с php -v коя версия наистина се съдържа.
Има ли пачнат официален образ за PHP 8.1?
Проектът PHP вече не издава официални релийзи за 8.1 и по-стари. Официален образ на тези клонове затова не може да съдържа редовна отстранена версия. Планирайте преминаване към поддържан клон.
По-рисков ли е вариантът apache от fpm?
Вариантът apache управлява PHP като Apache модул, тоест mod_php. Този режим на работа екипът на PHP оценява при PHP2Shell най-високо. И двата варианта изискват актуализацията; при mod_php бързината е особено важна.