Trenutno stanje: PHP2Shell. Dvije kritične PHP ranjivosti (CVSS 9.2) omogućuju zlonamjerni kod bez prijave. Zakrpe od 21. 10. 2026.Što sada učiniti →

php.ini objašnjen: struktura, razine i prednost

Gdje PHP nalazi svoje postavke, kojim redoslijedom djeluju i tko ih smije nadjačati. Osnova za svako ojačavanje i za prijelazne mjere za PHP2Shell.

Stanje 4 min čitanjaPHP znanje

Ukratko: php.ini je središnja konfiguracijska datoteka PHP-a. PHP je čita pri pokretanju, kod modula poslužitelja jednom, kod CGI-ja i CLI-ja pri svakom pozivu. Uz nju dolaze dodatne datoteke iz direktorija za skeniranje, postavke u FPM poolu ili u Apacheu, .htaccess odnosno .user.ini te ini_set() u kodu. Koja razina smije promijeniti vrijednost, određuje njezin način promjene, na primjer INI_SYSTEM ili INI_PERDIR. Vrijednosti postavljene putem php_admin_value aplikacija više ne može nadjačati.

Što je php.ini?

php.ini je tekstualna datoteka s unosima po uzorku name = wert. Određuje kako se PHP ponaša: koliko memorije skripta smije koristiti, pojavljuju li se pogreške u pregledniku, kako rade sesije i koje se ekstenzije učitavaju. Komentari počinju točkom sa zarezom.

Prema PHP priručniku datoteka se čita pri pokretanju PHP-a. Kod modula poslužitelja poput mod_php-a to se događa samo jednom, pri pokretanju web-poslužitelja, a kod CGI-ja i CLI-ja pri svakom pozivu. PHP-FPM konfiguraciju čita pri pokretanju i pri ponovnom učitavanju usluge. Promjena bez ponovnog pokretanja ili reloada zato najčešće ne djeluje.

Od PHP-a 8.3 unos prema priručniku može upućivati na varijablu okoline sa zamjenskom vrijednošću:

memory_limit = ${PHP_MEMORY_LIMIT}
max_execution_time = ${PHP_MAX_EXECUTION_TIME:-30}

Gdje PHP traži php.ini?

Priručnik opisuje čvrst redoslijed. Prvo vrijedi izričito postavljena putanja, na primjer PHPIniDir u Apacheu ili opcija -c kod CGI-ja i CLI-ja. Inače PHP gradi putanju pretraživanja iz:

  1. varijable okoline PHPRC,
  2. pod Windowsom unosa u registru IniFilePath,
  3. trenutnog radnog direktorija, osim kod SAPI-ja koji to isključuju, na primjer CLI-ja,
  4. direktorija PHP binarne datoteke odnosno modula,
  5. putanje --with-config-file-path postavljene pri kompiliranju.

Na toj putanji pretraživanja PHP najprije traži datoteku php-SAPI.ini, na primjer php-cli.ini, a tek potom php.ini. Zatim PHP abecednim redoslijedom čita sve .ini datoteke iz direktorija za skeniranje, koji je određen putem PHP_INI_SCAN_DIR ili pri kompiliranju putem --with-config-file-scan-dir. Koje su datoteke učitane, prikazuje php --ini ili funkcija php_ini_scanned_files().

php --ini
php -r 'var_dump(php_ini_loaded_file(), php_ini_scanned_files());'

Obje naredbe prikazuju stanje naredbenog retka. Za web-stranicu može vrijediti druga datoteka jer svaki SAPI može imati vlastitu konfiguraciju; više u članku SAPI objašnjen.

Načini promjene: tko smije postaviti koju vrijednost?

Ne smije se svaka postavka postaviti posvuda. Priručnik svakoj direktivi pridružuje način promjene:

Način Gdje se vrijednost smije postaviti
INI_USER u skriptama putem ini_set(), u Windows registru i u .user.ini
INI_PERDIR u php.ini, .htaccess, httpd.conf ili .user.ini
INI_SYSTEM samo u php.ini ili httpd.conf
INI_ALL posvuda

Primjeri iz priručnika: memory_limit ima način INI_ALL i zadano 128M, post_max_size ima INI_PERDIR i zadano 8M, upload_max_filesize ima INI_PERDIR i zadano 2M. expose_php smije stajati samo u php.ini.

Datoteke .user.ini prema priručniku čitaju samo CGI i FastCGI SAPI-ji, dakle i PHP-FPM. PHP ih traži od direktorija skripte prema gore do Document Roota i prema zadanim postavkama ponovno ih čita najviše svakih 300 sekundi (user_ini.cache_ttl). Pod mod_php-om tu ulogu preuzima .htaccess.

Koja vrijednost vrijedi na kraju? Razine po prednosti

Pojednostavljeno vrijedi: što kasnije neka razina djeluje, to se njezina vrijednost lakše nameće, ako način promjene to dopušta.

  1. php.ini dotičnog SAPI-ja
  2. Dodatne datoteke iz direktorija za skeniranje, abecednim redoslijedom
  3. Konfiguracija poslužitelja: FPM pool s php_value odnosno php_admin_value, Apache VirtualHost
  4. Razina direktorija: .htaccess kod mod_php-a, .user.ini kod FPM-a i CGI-ja
  5. Vrijeme izvođenja: ini_set() u kodu aplikacije

Iznimka je odlučujuća: vrijednosti postavljene putem php_admin_value ili php_admin_flag prema priručniku se ne mogu nadjačati putem ini_set(). Tako administratori zaključavaju sigurnosno važne postavke od aplikacije. Detaljno je opisano u članku php_admin_value: zaključati postavke od nadjačavanja.

php.ini nakon PHP2Shella: što se promijenilo

Prijelazne mjere php.net-a za PHP2Shell gotovo su sve INI postavke: memory_limit=-1 zaključan protiv nadjačavanja, ograničen post_max_size, session.upload_progress.enabled=0 i na PHP-u 8.5 fatal_error_backtraces=0. php.net naglašava da se session.upload_progress.enabled ne smije postavljati putem ini_set() ili .user.ini, nego u php.ini, FPM poolu ili konfiguraciji poslužitelja, uz naknadno ponovno pokretanje svih workera. Cjelovit popis nalazi se na stranici Hitne mjere dok još ne možete zakrpati.

S ispravljenim verzijama 8.5.12, 8.4.27, 8.3.36 i 8.2.35 prema priručniku promijenio se i memory_limit: sada je meka granica. Nova postavka memory_hard_limit_percent određuje tvrdu granicu. Bez vlastite vrijednosti iznosi dvostruku vrijednost memory_limit, a kod više od 1G tu vrijednost plus 1G. Ako se prekorači, proces odmah završava sa statusom izlaska 137. Kako smisleno odabrati obje granice, objašnjava članak Ispravno postaviti memory_limit.

Savjet

Prema priručniku vrijedi: ako PHP verzija ne prepoznaje memory_hard_limit_percent, pogođena je ranjivostima CVE-2026-109618 i CVE-2026-109619. Kod distribucija s backportovima stanje dodatno dokazuje changelog paketa.

Kako PHP SOS konkretno pomaže?

  • Utvrditi djelotvorne vrijednosti: Za svaki SAPI očitavamo koje se datoteke učitavaju i koja vrijednost na kraju vrijedi.
  • Pospremiti razine: Uklanjamo proturječne unose iz panela, poolova, .htaccess i .user.ini.
  • Postaviti zaključavanja: U okviru ojačavanja poslužitelja sigurnosno važne vrijednosti određujemo putem php_admin_value.
  • Dokazati: Dokumentiramo postavke i ponovno pokretanje kako bi se stanje kasnije moglo dokazati.

Česta pitanja

Gdje se nalazi php.ini?

To ovisi o operacijskom sustavu, paketu i SAPI-ju. Na Debianu i Ubuntuu postoje zasebne mape po verziji i SAPI-ju, na primjer /etc/php/8.3/fpm/php.ini i /etc/php/8.3/cli/php.ini. U naredbenom retku php --ini prikazuje učitane datoteke, a za web-stranicu pomaže php_ini_loaded_file() u kratkotrajnoj probnoj datoteci.

Kojim se redoslijedom čitaju datoteke u mapi conf.d?

Prema PHP priručniku PHP čita sve datoteke s nastavkom .ini u direktoriju za skeniranje abecednim redoslijedom. Kasnije datoteke nadjačavaju vrijednosti ranijih. Zato mnoge datoteke u nazivu imaju brojeve poput 20- ili 99-.

Zašto moja promjena u php.ini ne djeluje?

Česti razlozi: promijenjena je datoteka drugog SAPI-ja, usluga nije ponovno pokrenuta, vrijednost je nadjačana u FPM poolu, u Apache konfiguraciji ili u .user.ini, ili hosting panel pri sljedećem spremanju iznova piše datoteku.

Što je memory_hard_limit_percent?

Nova postavka koja je prema PHP priručniku uvedena sigurnosnim izdanjima od 21. 10. 2026. Određuje tvrdu granicu memorije kao postotak od memory_limit. Priručnik upozorava da je PHP verzija koja ne poznaje tu postavku pogođena PHP2Shell ranjivostima.

Izvori

Hitni kontakt

Svaki sat se računa. Pišite nam odmah.

Ukratko opišite sustav, verziju PHP-a i opažanje. Javit ćemo Vam se, razjasniti situaciju i raditi na daljinu dok incident nije zaključen i dokumentiran.

Hitna pomoć