Na kratko: Za skrbnike brez razvijalskega ozadja zadošča pet osnov za varno obratovanje PHP: PHP sestavlja več programov (ukazna vrstica, PHP-FPM, modul Apache) z vsakokrat lastno različico; nastavitve delujejo po ravneh od php.ini do aplikacije; PHP-FPM zahteve razporeja na workerje v poolih; posodobitev učinkuje šele po ponovnem zagonu vseh procesov; dnevniki pa so najpomembnejši namig, kadar kaj ne drži. Kdor te točke pozna, lahko vrzeli, kot je PHP2Shell, zapre hitro in dokazljivo.
Iz česa je sestavljen PHP na strežniku
PHP ni en sam program. Na tipičnem strežniku Linux je več različic, vsaka je priključena prek strežniškega vmesnika (SAPI):
| Različica | Tipično ime | Za kaj |
|---|---|---|
| Ukazna vrstica (CLI) | php, php8.3 |
cronjobi, Composer, vzdrževalne skripte |
| PHP-FPM | php-fpm, php-fpm8.3 |
spletne zahteve za Nginxom ali Apacheem |
| Modul Apache | mod_php, libphp |
spletne zahteve neposredno v procesu Apache |
| CGI | php-cgi |
starejše postavitve |
Vsaka različica ima lahko drugo različico in drug php.ini. Na številnih strežnikih poleg tega vzporedno teče več različic PHP, na primer 8.2 in 8.4. Pri posodobitvi je treba vsako obravnavati posebej. Kako vmesniki delujejo, razlaga PHP-FPM razložen.
Katera različica dejansko streže vašim spletnim stranem, ugotovite prek tekočih procesov in konfiguracije spletnega strežnika:
ps -eo pid,user,lstart,cmd | grep -E "php|httpd|apache2" | grep -v grep
apachectl -M 2>/dev/null | grep -i php # ali Apache nalaga modul PHP?
ls /run/php/ 2>/dev/null # vtiči FPM, pogosto po različici in poolu
Stolpec s časom zagona je pozneje pri ponovnem zagonu pomemben: vsi procesi PHP morajo biti zagnani po času posodobitve. Če procesi tečejo pod različnimi uporabniki, to kaže na ločene poole, kar je dobro. Če se v Apacheu pojavi modul PHP, čeprav naj bi vse spletne strani tekle prek FPM, je to namig na staro breme, ki ga je treba odstraniti. Za gostiteljske vmesnike, kot sta Plesk ali cPanel, velja isto načelo, le da vmesnik prikazuje različice in handlerje po spletnih straneh; merodajno pa ostane to, kar dejansko teče kot proces.
Najpomembnejši ukazi za skrbnike
php -v # različica ukazne vrstice
php --ini # naložen php.ini in dodatno prebrani imeniki
php --ini=diff # od PHP 8.5: odstopanja od privzetih vrednosti
php -m # vkompilirani in naloženi moduli
php --ri session # nastavitve razširitve
php -l datei.php # preverjanje sintakse brez izvajanja
php-fpm8.3 -v # različica binarne datoteke FPM (ime glede na distribucijo)
php-fpm8.3 -t # preizkus konfiguracije FPM brez ponovnega zagona
systemctl status php8.3-fpm
Dva namiga iz priročnika: php -l najde sintaktične napake, ne pa napak, ki nastanejo šele med izvajanjem. In php -i pokliče phpinfo(); izpis ne sodi v javne datoteke v spletnem imeniku.
Kako delujejo nastavitve PHP
Nastavitev je mogoče določiti na več mestih. Kdo sme kje kaj spremeniti, ureja način spremembe vsake direktive:
- php.ini in conf.d: osnovna konfiguracija po različici, prebrana ob zagonu.
- Pool FPM:
php_valueinphp_admin_valuepo poolu. Vrednosti, nastavljenih sphp_admin_value, aplikacija po priročniku ne more prepisati zini_set(). - Raven imenika:
.user.inipri FPM ali.htaccesspri mod_php, samo za direktive v načinuINI_PERDIRaliINI_ALL. - Aplikacija:
ini_set()med izvajanjem, samo za direktive v načinuINI_ALL.
Primer: memory_limit ima način INI_ALL, aplikacija ga torej lahko spremeni. post_max_size ima INI_PERDIR in ga ni mogoče spremeniti z ini_set(). Zato php.net pri prehodnih ukrepih za PHP2Shell zahteva, da se vrednosti nastavijo tako, da jih aplikacije ne morejo prepisati. Podrobnosti o ravneh razlaga php.ini razložen.
Pooli PHP-FPM na kratko
Pool je skupina workerjev z lastnim uporabnikom, lastnim vtičem (socket) in lastnimi nastavitvami. Najpomembnejše direktive po priročniku:
[shop]
user = shop
group = shop
listen = /run/php/shop.sock
pm = dynamic ; static, dynamic ali ondemand
pm.max_children = 20 ; največ 20 hkratnih zahtev
pm.max_requests = 500 ; workerja obnoviti po 500 zahtevah
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
Lasten pool na spletno stran z lastnim uporabnikom spletne strani med seboj loči. security.limit_extensions je privzeto .php .phar in preprečuje, da bi FPM izvajal druge končnice datotek kot PHP. clear_env je privzeto vklopljen in spremenljivke okolja drži stran od workerja.
Dnevniki: kam naj gledajo skrbniki
PHP napake zapisuje v cilj, določen z error_log, PHP-FPM dodatno v svoj dnevnik, pri počasnih zahtevah pa v slowlog s sledjo klicev (backtrace). Zraven pridejo dnevniki dostopov in napak spletnega strežnika. Pazite, da je display_errors v produkciji izklopljen in log_errors vklopljen: napake sodijo v dnevnik, ne na spletno stran. Dnevnike je poleg tega treba rotirati in hraniti določen čas, da so v resnem primeru še na voljo. Po PHP2Shell strokovni tisk priporoča hranjenje dnevnikov strežnika od 20. 10. 2026. Močan opozorilni znak je proces PHP-FPM ali spletnega strežnika, ki zažene lupino; kako to prepoznate, je pod Opozorilni znak: spletni strežnik zažene lupino.
Kontrolni seznam za skrbnike po PHP2Shell
- Našteti vse različice in izdaje PHP na strežniku, tudi tiste, ki se ne uporabljajo.
- Preveriti stanje paketov; pri backportih distribucije v dnevniku sprememb poiskati CVE-2026-109618 in CVE-2026-109619.
- Posodobiti na 8.5.12, 8.4.27, 8.3.36 ali 8.2.35 oziroma potrjeni backport.
- Znova zagnati PHP-FPM, Apache in LiteSpeed ter preveriti čase zagona procesov.
- Kontrolni preizkus s
php -r 'var_dump(ini_get("memory_hard_limit_percent"));';bool(false)po priročniku pomeni prizadeto različico. - Zavarovati dnevnike in jih preveriti glede nepravilnosti.
Kako različico in stanje popravkov zanesljivo dokažete, opisuje Pravilno preverjanje različice PHP in stanja popravkov.
Kako PHP SOS pomaga konkretno?
V varnostni vzdrževalni pogodbi osnovno vzdrževanje PHP prevzamemo skupaj z vašo ekipo:
- Popis: vse različice PHP, izdaje, pooli in mesta konfiguracije po strežnikih.
- Konfiguracija: varnostno pomembne vrednosti nastavljene s
php_admin_value, pooli ločeni po spletnih straneh. - Posodobitve: namestitev, ponovni zagon, kontrola in dokumentacija ob vsaki varnostni izdaji.
- Prenos znanja: vašim skrbnikom razložimo, kaj smo spremenili in zakaj.
Pogosta vprašanja
Zakaj php -v prikaže drugo različico kot spletna stran?
Ukazna vrstica, PHP-FPM in modul Apache so ločeni programi z lastno različico in lastnim php.ini. php -v prikaže samo ukazno vrstico. Za spletno stran šteje različica binarne datoteke, ki dejansko obdeluje zahteve.
Kateri php.ini velja na mojem strežniku?
To pokaže php --ini za ukazno vrstico. Za PHP-FPM je praviloma lasten php.ini in dodatne datoteke poolov. Od PHP 8.5 php --ini=diff pokaže, katere vrednosti odstopajo od privzetih.
Kakšna je razlika med php_value in php_admin_value?
Oba nastavita vrednosti v poolu FPM. Vrednosti s php_admin_value aplikacija po priročniku ne more prepisati z ini_set(). Za varnostno pomembne nastavitve je zato php_admin_value prava izbira.
Ali zadošča posodobitev brez ponovnega zagona?
Ne. Tekoči procesi PHP obdržijo staro kodo v pomnilniku. Po posodobitvi je treba znova zagnati PHP-FPM, Apache z mod_php ali LiteSpeed, sicer ranljiva različica teče naprej.