Ukratko: Administratorima bez razvojne pozadine dovoljno je pet temelja za siguran rad PHP-a: PHP se sastoji od više programa (naredbeni redak, PHP-FPM, Apache modul), svaki s vlastitom verzijom; postavke djeluju u razinama od php.ini do aplikacije; PHP-FPM raspoređuje zahtjeve na workere u poolovima; ažuriranje djeluje tek nakon ponovnog pokretanja svih procesa; a zapisnici su najvažniji trag kad nešto nije u redu. Tko poznaje te točke, ranjivosti poput PHP2Shella može zatvoriti brzo i dokazivo.
Od čega se PHP sastoji na poslužitelju
PHP nije jedan program. Na tipičnom Linux poslužitelju nalazi se nekoliko varijanti koje su svaka povezana putem poslužiteljskog sučelja (SAPI):
| Varijanta | Tipičan naziv | Čemu služi |
|---|---|---|
| Naredbeni redak (CLI) | php, php8.3 |
cron poslovi, Composer, skripte za održavanje |
| PHP-FPM | php-fpm, php-fpm8.3 |
web-zahtjevi iza Nginxa ili Apachea |
| Apache modul | mod_php, libphp |
web-zahtjevi izravno u Apacheovu procesu |
| CGI | php-cgi |
starije izvedbe |
Svaka varijanta može imati drugu verziju i drugi php.ini. Na mnogim poslužiteljima uz to paralelno rade i višestruke verzije PHP-a, primjerice 8.2 i 8.4. Pri ažuriranju svaku treba promatrati zasebno. Kako sučelja rade, objašnjava PHP-FPM objašnjen.
Koja varijanta stvarno poslužuje Vaše web-stranice, doznajete preko pokrenutih procesa i konfiguracije web-poslužitelja:
ps -eo pid,user,lstart,cmd | grep -E "php|httpd|apache2" | grep -v grep
apachectl -M 2>/dev/null | grep -i php # učitava li Apache PHP modul?
ls /run/php/ 2>/dev/null # FPM socketi, često po verziji i poolu
Stupac s vremenom pokretanja kasnije je važan pri ponovnom pokretanju: svi PHP procesi moraju biti pokrenuti nakon trenutka ažuriranja. Ako procesi rade pod različitim korisnicima, to upućuje na odvojene poolove, što je dobro. Ako se u Apacheu pojavi PHP modul iako sve web-stranice trebaju raditi preko FPM-a, to je pokazatelj naslijeđenog ostatka koji treba ukloniti. Za hosting sučelja poput Plesk ili cPanel vrijedi isto načelo, samo što sučelje prikazuje verzije i handlere po web-stranici; mjerodavno ipak ostaje što stvarno radi kao proces.
Najvažnije naredbe za administratore
php -v # verzija naredbenog retka
php --ini # učitani php.ini i dodatno čitani direktoriji
php --ini=diff # od PHP-a 8.5: odstupanja od zadanog
php -m # ugrađeni i učitani moduli
php --ri session # postavke jedne ekstenzije
php -l datei.php # provjera sintakse bez izvršavanja
php-fpm8.3 -v # verzija FPM binarne datoteke (naziv ovisi o distribuciji)
php-fpm8.3 -t # testirati FPM konfiguraciju bez ponovnog pokretanja
systemctl status php8.3-fpm
Dvije napomene iz priručnika: php -l pronalazi sintaksne pogreške, ali ne pogreške koje nastaju tek pri izvršavanju. I php -i poziva phpinfo(); izlaz ne pripada u javne datoteke u web-direktoriju.
Kako djeluju PHP postavke
Postavka se može zadati na više mjesta. Tko gdje što smije mijenjati, uređuje način promjene svake direktive:
- php.ini i conf.d: osnovna konfiguracija po varijanti, čita se pri pokretanju.
- FPM pool:
php_valueiphp_admin_valuepo poolu. Vrijednosti postavljene sphp_admin_valueaplikacija prema priručniku ne može prepisati sini_set(). - Razina direktorija:
.user.inikod FPM-a ili.htaccesskod mod_php-a, samo za direktive u načinuINI_PERDIRiliINI_ALL. - Aplikacija:
ini_set()tijekom izvođenja, samo za direktive u načinuINI_ALL.
Primjer: memory_limit ima način INI_ALL, dakle aplikacija ga može promijeniti. post_max_size ima INI_PERDIR i ne može se promijeniti s ini_set(). Zato php.net kod prijelaznih mjera za PHP2Shell traži da se vrijednosti postave tako da ih aplikacije ne mogu prepisati. Pojedinosti o razinama objašnjava php.ini objašnjen.
PHP-FPM poolovi ukratko
Pool je skupina workera s vlastitim korisnikom, vlastitim socketom i vlastitim postavkama. Najvažnije direktive prema priručniku:
[shop]
user = shop
group = shop
listen = /run/php/shop.sock
pm = dynamic ; static, dynamic ili ondemand
pm.max_children = 20 ; najviše 20 istodobnih zahtjeva
pm.max_requests = 500 ; obnoviti worker nakon 500 zahtjeva
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
Vlastiti pool po web-stranici s vlastitim korisnikom razdvaja web-stranice jednu od druge. security.limit_extensions prema zadanim je postavkama .php .phar i sprječava FPM da izvršava druge nastavke datoteka osim PHP-a. clear_env prema zadanim je postavkama uključen i drži varijable okruženja podalje od workera.
Zapisnici: gdje administratori trebaju gledati
PHP pogreške zapisuje na odredište određeno s error_log, PHP-FPM dodatno u vlastiti zapisnik, a kod sporih zahtjeva u slowlog s backtraceom. Tu su i zapisnici pristupa i pogrešaka web-poslužitelja. Pazite da je display_errors u produkciji isključen, a log_errors uključen: pogreške pripadaju u zapisnik, a ne na web-stranicu. Zapisnike treba i rotirati te čuvati određeno razdoblje kako bi u kriznom slučaju još postojali. Nakon PHP2Shella stručni tisak preporučuje čuvanje zapisnika poslužitelja od 20. 10. 2026. Snažan znak upozorenja je PHP-FPM ili proces web-poslužitelja koji pokreće shell; kako to prepoznati, piše na stranici Znak upozorenja: web-poslužitelj pokreće shell.
Popis provjere za administratore nakon PHP2Shella
- Popisati sve PHP varijante i verzije na poslužitelju, i one koje se ne koriste.
- Provjeriti stanje paketa; kod backportova distribucije pretražiti changelog za CVE-2026-109618 i CVE-2026-109619.
- Ažurirati na 8.5.12, 8.4.27, 8.3.36 ili 8.2.35 odnosno potvrđeni backport.
- Ponovno pokrenuti PHP-FPM, Apache i LiteSpeed i provjeriti vremena pokretanja procesa.
- Protuprovjera s
php -r 'var_dump(ini_get("memory_hard_limit_percent"));';bool(false)prema priručniku znači pogođenu verziju. - Osigurati zapisnike i provjeriti ima li neobičnosti.
Kako pouzdano dokazati verziju i razinu zakrpa, opisuje Ispravna provjera verzije i razine zakrpa PHP-a.
Kako PHP SOS konkretno pomaže?
U sigurnosnom ugovoru o održavanju osnovnu brigu o PHP-u preuzimamo zajedno s Vašim timom:
- Inventar: sve PHP varijante, verzije, poolovi i mjesta konfiguracije po poslužitelju.
- Konfiguracija: sigurnosno relevantne vrijednosti postavljene s
php_admin_value, poolovi razdvojeni po web-stranici. - Ažuriranja: instalacija, ponovno pokretanje, kontrola i dokumentacija pri svakom sigurnosnom izdanju.
- Prijenos znanja: objašnjavamo Vašim administratorima što smo promijenili i zašto.
Česta pitanja
Zašto php -v prikazuje drukčiju verziju od web-stranice?
Naredbeni redak, PHP-FPM i Apache modul zasebni su programi s vlastitom verzijom i vlastitim php.ini. php -v prikazuje samo naredbeni redak. Za web-stranicu vrijedi verzija binarne datoteke koja stvarno obrađuje zahtjeve.
Koji php.ini vrijedi na mom poslužitelju?
To pokazuje php --ini za naredbeni redak. Za PHP-FPM uglavnom postoji vlastiti php.ini i dodatne datoteke poolova. Od PHP-a 8.5 php --ini=diff prikazuje koje se vrijednosti razlikuju od zadanih.
Koja je razlika između php_value i php_admin_value?
Oba postavljaju postavke u FPM poolu. Vrijednosti postavljene s php_admin_value aplikacija prema priručniku ne može prepisati s ini_set(). Za sigurnosno relevantne postavke php_admin_value je stoga prava mjera.
Je li dovoljno ažuriranje bez ponovnog pokretanja?
Ne. Pokrenuti PHP procesi zadržavaju stari kod u memoriji. Nakon ažuriranja moraju se ponovno pokrenuti PHP-FPM, Apache s mod_php-om ili LiteSpeed, inače nastavlja raditi ranjiva verzija.