Aktuálna situácia: PHP2Shell. Dve kritické zraniteľnosti PHP (CVSS 9.2) umožňujú spustenie škodlivého kódu bez prihlásenia. Záplaty od 21. 10. 2026.Čo treba urobiť teraz →

php.ini vysvetlený: štruktúra, úrovne a priorita

Kde PHP nachádza svoje nastavenia, v akom poradí platia a kto ich smie prepísať. Základ pre každé zabezpečenie a pre prechodné opatrenia k PHP2Shell.

Stav 4 min čítaniaZnalosti o PHP

Stručne: php.ini je centrálny konfiguračný súbor PHP. PHP ho číta pri štarte, pri serverových moduloch raz, pri CGI a CLI pri každom volaní. K tomu pristupujú doplnkové súbory zo skenovaného adresára, nastavenia v poole FPM alebo v Apache, .htaccess, resp. .user.ini a ini_set() v kóde. Ktorá úroveň smie hodnotu zmeniť, určuje jej režim zmeny, napríklad INI_SYSTEM alebo INI_PERDIR. Hodnoty cez php_admin_value už aplikácia prepísať nemôže.

Čo je php.ini?

php.ini je textový súbor so záznamami podľa vzoru name = wert. Určuje, ako sa PHP správa: koľko pamäte smie skript použiť, či sa chyby zobrazujú v prehliadači, ako pracujú relácie a ktoré rozšírenia sa načítavajú. Komentáre začínajú bodkočiarkou.

Podľa príručky PHP sa súbor číta pri štarte PHP. Pri serverových moduloch ako mod_php sa to deje iba raz, pri štarte webového servera, pri CGI a CLI pri každom volaní. PHP-FPM číta svoju konfiguráciu pri štarte a pri znovunačítaní služby. Zmena bez reštartu alebo reloadu preto väčšinou nepôsobí.

Od PHP 8.3 môže záznam podľa príručky odkazovať na premennú prostredia so zástupnou hodnotou:

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

Kde PHP hľadá php.ini?

Príručka opisuje pevné poradie. Najprv platí výslovne nastavená cesta, napríklad PHPIniDir v Apache alebo voľba -c pri CGI a CLI. Inak zostaví PHP cestu hľadania z:

  1. premennej prostredia PHPRC,
  2. vo Windows zo záznamu v registri IniFilePath,
  3. aktuálneho pracovného adresára, okrem SAPI, ktoré to vypínajú, napríklad CLI,
  4. adresára binárneho súboru PHP, resp. modulu,
  5. cesty --with-config-file-path nastavenej pri kompilácii.

V tejto ceste hľadania PHP najprv hľadá súbor php-SAPI.ini, napríklad php-cli.ini, a až potom php.ini. Potom PHP prečíta všetky súbory .ini zo skenovaného adresára, určeného cez PHP_INI_SCAN_DIR alebo pri kompilácii cez --with-config-file-scan-dir, v abecednom poradí. Ktoré súbory sa načítali, ukazuje php --ini alebo funkcia php_ini_scanned_files().

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

Oba príkazy ukazujú stav príkazového riadka. Pre web môže platiť iný súbor, pretože každá SAPI môže mať vlastnú konfiguráciu; viac v časti SAPI vysvetlené.

Režimy zmeny: kto smie nastaviť ktorú hodnotu?

Nie každé nastavenie sa smie zadať všade. Príručka priraďuje každej direktíve režim zmeny:

Režim Kde smie byť hodnota nastavená
INI_USER v skriptoch cez ini_set(), v registri Windows a v .user.ini
INI_PERDIR v php.ini, .htaccess, httpd.conf alebo .user.ini
INI_SYSTEM iba v php.ini alebo httpd.conf
INI_ALL všade

Príklady z príručky: memory_limit má režim INI_ALL a štandard 128M, post_max_size má INI_PERDIR a štandard 8M, upload_max_filesize má INI_PERDIR a štandard 2M. expose_php smie byť iba v php.ini.

Súbory .user.ini čítajú podľa príručky len SAPI CGI a FastCGI, teda aj PHP-FPM. PHP ich hľadá od adresára skriptu smerom nahor až po Document Root a štandardne ich znova číta najviac každých 300 sekúnd (user_ini.cache_ttl). Pod mod_php túto úlohu preberá .htaccess.

Ktorá hodnota nakoniec platí? Úrovne a priorita

Zjednodušene platí: čím neskôr úroveň zasiahne, tým skôr sa jej hodnota presadí, pokiaľ to režim zmeny dovoľuje.

  1. php.ini príslušnej SAPI
  2. Doplnkové súbory zo skenovaného adresára, abecedne
  3. Konfigurácia servera: pool FPM s php_value, resp. php_admin_value, VirtualHost Apache
  4. Úroveň adresára: .htaccess pri mod_php, .user.ini pri FPM a CGI
  5. Beh: ini_set() v kóde aplikácie

Výnimka je rozhodujúca: hodnoty cez php_admin_value alebo php_admin_flag sa podľa príručky nedajú prepísať cez ini_set(). Správcovia tak zamykajú bezpečnostne relevantné nastavenia pred aplikáciou. Podrobne je to opísané v časti php_admin_value: zamknúť nastavenia proti prepísaniu.

php.ini po PHP2Shell: čo sa zmenilo

Prechodné opatrenia z php.net k PHP2Shell sú takmer všetky nastavenia INI: memory_limit=-1 zamknuté proti prepísaniu, obmedzené post_max_size, session.upload_progress.enabled=0 a v PHP 8.5 fatal_error_backtraces=0. php.net zdôrazňuje, že session.upload_progress.enabled sa nemá nastavovať cez ini_set() ani .user.ini, ale v php.ini, v poole FPM alebo v konfigurácii servera, s následným reštartom všetkých workerov. Úplný zoznam je na stránke Okamžité opatrenia, ak ešte nemôžete záplatovať.

S opravenými verziami 8.5.12, 8.4.27, 8.3.36 a 8.2.35 sa podľa príručky zmenil aj memory_limit: je teraz mäkká hranica. Nové nastavenie memory_hard_limit_percent určuje tvrdú hranicu. Bez vlastnej hodnoty je to dvojnásobok memory_limit, pri viac než 1G hodnota plus 1G. Pri jej prekročení proces okamžite skončí so stavom ukončenia 137. Ako obe hranice rozumne zvoliť, vysvetľuje Správne nastavenie memory_limit.

Tip

Podľa príručky platí: ak verzia PHP nepozná memory_hard_limit_percent, je dotknutá zraniteľnosťami CVE-2026-109618 a CVE-2026-109619. Pri distribúciách s backportmi stav navyše dokladá changelog balíka.

Ako konkrétne pomáha PHP SOS?

  • Zistiť účinné hodnoty: Pre každú SAPI zisťujeme, ktoré súbory sa načítavajú a ktorá hodnota nakoniec platí.
  • Upratať úrovne: Odstraňujeme protichodné záznamy z panelov, poolov, .htaccess a .user.ini.
  • Nastaviť zámky: V rámci zabezpečenia servera (hardening) určujeme bezpečnostne relevantné hodnoty cez php_admin_value.
  • Doložiť: Dokumentujeme nastavenia a reštart, aby bol stav neskôr preukázateľný.

Časté otázky

Kde leží php.ini?

Závisí to od operačného systému, balíka a SAPI. V Debiane a Ubuntu existujú pre každú verziu a SAPI vlastné priečinky, napríklad /etc/php/8.3/fpm/php.ini a /etc/php/8.3/cli/php.ini. V príkazovom riadku ukáže načítané súbory php --ini, pre web pomôže php_ini_loaded_file() v krátkodobom kontrolnom súbore.

V akom poradí sa čítajú súbory v priečinku conf.d?

Podľa príručky PHP číta PHP všetky súbory s príponou .ini v skenovanom adresári v abecednom poradí. Neskoršie súbory prepisujú hodnoty skorších. Preto majú mnohé súbory v názve čísla ako 20- alebo 99-.

Prečo moja zmena v php.ini nepôsobí?

Časté dôvody: zmenil sa súbor inej SAPI, služba sa nereštartovala, hodnotu prepisuje nastavenie v poole FPM, v konfigurácii Apache alebo v .user.ini, alebo hostingový panel súbor pri ďalšom uložení prepíše.

Čo je memory_hard_limit_percent?

Nové nastavenie, ktoré bolo podľa príručky PHP zavedené s bezpečnostnými vydaniami z 21. 10. 2026. Určuje tvrdú hranicu pamäte ako percento z memory_limit. Príručka upozorňuje, že verzia PHP, ktorá toto nastavenie nepozná, je zraniteľnosťami PHP2Shell dotknutá.

Zdroje

Okamžitý kontakt

Každá hodina sa počíta. Napíšte nám hneď.

Stručne opíšte systém, verziu PHP a svoje pozorovanie. Ozveme sa, vyjasníme situáciu a budeme pracovať na diaľku, kým nebude incident uzavretý a zdokumentovaný.

Okamžitá pomoc