Stručne: Pre adminov bez vývojárskeho zázemia stačí na bezpečnú prevádzku PHP päť základov: PHP pozostáva z viacerých programov (príkazový riadok, PHP-FPM, modul Apache), z ktorých každý má vlastnú verziu; nastavenia pôsobia v úrovniach od php.ini až po aplikáciu; PHP-FPM rozdeľuje požiadavky na workerov v poolach; aktualizácia zaberie až po reštarte všetkých procesov; a logy sú najdôležitejším signálom, keď niečo nesedí. Kto tieto body pozná, dokáže zraniteľnosti ako PHP2Shell uzavrieť rýchlo a preukázateľne.
Z čoho PHP na serveri pozostáva
PHP nie je jediný program. Na typickom serveri s Linuxom sa nachádza viac variantov, z ktorých každý je pripojený cez serverové rozhranie (SAPI):
| Variant | Typický názov | Na čo |
|---|---|---|
| Príkazový riadok (CLI) | php, php8.3 |
cronjoby, Composer, údržbové skripty |
| PHP-FPM | php-fpm, php-fpm8.3 |
webové požiadavky za Nginx alebo Apache |
| Modul Apache | mod_php, libphp |
webové požiadavky priamo v procese Apache |
| CGI | php-cgi |
staršie nasadenia |
Každý variant môže mať inú verziu a iný php.ini. Na mnohých serveroch navyše paralelne beží viac verzií PHP, napríklad 8.2 a 8.4. Pri aktualizácii sa musí každá posudzovať zvlášť. Ako rozhrania fungujú, vysvetľuje PHP-FPM vysvetlené.
Ktorý variant vaše weby skutočne obsluhuje, zistíte z bežiacich procesov a z konfigurácie webového servera:
ps -eo pid,user,lstart,cmd | grep -E "php|httpd|apache2" | grep -v grep
apachectl -M 2>/dev/null | grep -i php # načíta Apache modul PHP?
ls /run/php/ 2>/dev/null # sockety FPM, často na verziu a pool
Stĺpec s časom štartu je neskôr pri reštarte dôležitý: všetky procesy PHP musia byť spustené po čase aktualizácie. Ak procesy bežia pod rôznymi používateľmi, naznačuje to oddelené pooly, čo je dobré. Ak sa v Apache objaví modul PHP, hoci majú všetky weby bežať cez FPM, je to náznak starého bremena, ktoré treba odstrániť. Pre hostingové rozhrania ako Plesk alebo cPanel platí ten istý princíp, len rozhranie ukazuje verzie a handlery pre každý web; rozhodujúce však zostáva to, čo skutočne beží ako proces.
Najdôležitejšie príkazy pre adminov
php -v # verzia príkazového riadku
php --ini # načítaný php.ini a dodatočne čítané adresáre
php --ini=diff # od PHP 8.5: odchýlky od štandardu
php -m # zakompilované a načítané moduly
php --ri session # nastavenia rozšírenia
php -l datei.php # kontrola syntaxe bez spustenia
php-fpm8.3 -v # verzia binárky FPM (názov podľa distribúcie)
php-fpm8.3 -t # otestovať konfiguráciu FPM bez reštartu
systemctl status php8.3-fpm
Dve poznámky z príručky: php -l nájde syntaktické chyby, ale nie chyby, ktoré nastanú až pri vykonávaní. A php -i volá phpinfo(); jeho výstup nepatrí do verejných súborov vo webovom adresári.
Ako pôsobia nastavenia PHP
Nastavenie sa môže určiť na viacerých miestach. Kto smie kde čo meniť, upravuje režim zmeny každej direktívy:
- php.ini a conf.d: základná konfigurácia pre každý variant, číta sa pri štarte.
- Pool FPM:
php_valueaphp_admin_valuepre každý pool. Hodnoty nastavené pomocouphp_admin_valueaplikácia podľa príručky nemôže prepísať cezini_set(). - Úroveň adresára:
.user.inipri FPM alebo.htaccesspri mod_php, iba pre direktívy v režimeINI_PERDIRaleboINI_ALL. - Aplikácia:
ini_set()za behu, iba pre direktívy v režimeINI_ALL.
Príklad: memory_limit má režim INI_ALL, aplikácia ho teda môže zmeniť. post_max_size má INI_PERDIR a pomocou ini_set() sa zmeniť nedá. Preto php.net pri prechodných opatreniach PHP2Shell vyžaduje nastavovať hodnoty tak, aby ich aplikácie nemohli prepísať. Podrobnosti o úrovniach vysvetľuje php.ini vysvetlený.
Pooly PHP-FPM v kocke
Pool je skupina workerov s vlastným používateľom, vlastným socketom a vlastnými nastaveniami. Najdôležitejšie direktívy podľa príručky:
[shop]
user = shop
group = shop
listen = /run/php/shop.sock
pm = dynamic ; static, dynamic alebo ondemand
pm.max_children = 20 ; najviac 20 súčasných požiadaviek
pm.max_requests = 500 ; obnoviť worker po 500 požiadavkách
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/shop-slow.log
php_admin_value[error_log] = /var/log/php-fpm/shop-error.log
php_admin_flag[log_errors] = on
Vlastný pool pre každý web s vlastným používateľom oddeľuje weby navzájom. security.limit_extensions je štandardne nastavené na .php .phar a bráni tomu, aby FPM vykonával iné prípony súborov než PHP. clear_env je štandardne zapnuté a drží premenné prostredia mimo workera.
Logy: kam sa admini majú pozerať
PHP zapisuje chyby do cieľa určeného pomocou error_log, PHP-FPM navyše do vlastného logu a pri pomalých požiadavkách do slowlogu s backtrace. K tomu pribúdajú prístupové logy a logy chýb webového servera. Dbajte na to, aby bolo display_errors v produkcii vypnuté a log_errors zapnuté: chyby patria do logu, nie na webovú stránku. Logy by sa mali navyše rotovať a uchovávať počas stanoveného obdobia, aby v kritickom prípade ešte existovali. Po PHP2Shell odborná tlač odporúča uchovávať logy servera od 20. 10. 2026. Silným varovným signálom je proces PHP-FPM alebo webového servera, ktorý spustí shell; ako to rozpoznať, je uvedené v Varovný signál: webový server spúšťa shell.
Kontrolný zoznam pre adminov po PHP2Shell
- Vypísať všetky varianty a verzie PHP na serveri, aj nepoužívané.
- Skontrolovať stav balíkov; pri backportoch distribúcie prehľadať changelog na CVE-2026-109618 a CVE-2026-109619.
- Aktualizovať na 8.5.12, 8.4.27, 8.3.36 alebo 8.2.35, resp. potvrdený backport.
- Reštartovať PHP-FPM, Apache a LiteSpeed a skontrolovať časy štartu procesov.
- Protikontrola pomocou
php -r 'var_dump(ini_get("memory_hard_limit_percent"));';bool(false)znamená podľa príručky dotknutú verziu. - Zálohovať logy a skontrolovať ich na nezrovnalosti.
Ako spoľahlivo preukázať verziu a stav záplat, opisuje Správna kontrola verzie PHP a stavu záplat.
Ako PHP SOS konkrétne pomáha?
V zmluve o bezpečnostnej údržbe preberáme základnú starostlivosť o PHP spolu s vaším tímom:
- Inventár: všetky varianty PHP, verzie, pooly a miesta konfigurácie pre každý server.
- Konfigurácia: bezpečnostne relevantné hodnoty nastavené pomocou
php_admin_value, pooly oddelené pre každý web. - Aktualizácie: nasadenie, reštart, kontrola a dokumentácia pri každom bezpečnostnom vydaní.
- Odovzdávanie znalostí: Vašim adminom vysvetľujeme, čo sme zmenili a prečo.
Časté otázky
Prečo php -v ukazuje inú verziu než web?
Príkazový riadok, PHP-FPM a modul Apache sú oddelené programy s vlastnou verziou a vlastným php.ini. php -v ukazuje iba príkazový riadok. Pre web je rozhodujúca verzia binárky, ktorá skutočne vybavuje požiadavky.
Ktorý php.ini platí na mojom serveri?
To ukáže php --ini pre príkazový riadok. Pre PHP-FPM existuje zvyčajne vlastný php.ini a ďalšie súbory poolov. Od PHP 8.5 ukazuje php --ini=diff, ktoré hodnoty sa líšia od štandardu.
Aký je rozdiel medzi php_value a php_admin_value?
Obe nastavujú hodnoty v poole FPM. Hodnoty nastavené pomocou php_admin_value aplikácia podľa príručky nemôže prepísať pomocou ini_set(). Pre bezpečnostne relevantné nastavenia je preto php_admin_value správna voľba.
Stačí aktualizácia bez reštartu?
Nie. Bežiace procesy PHP si ponechávajú starý kód v pamäti. Po aktualizácii sa musia reštartovať PHP-FPM, Apache s mod_php alebo LiteSpeed, inak naďalej beží zraniteľná verzia.