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 →

Bezpečná konfigurácia php.ini

Ktoré nastavenia v php.ini zmenšujú útočnú plochu, ako ich chrániť pred prepísaním a čo platí po PHP2Shell navyše.

Stav 5 min čítaniaPríručky

Stručne: Pre bezpečnosť php.ini sú rozhodujúce hlavne štyri oblasti: žiadne chybové hlásenia smerom von, bezpečné cookies session, obmedzené uploady a zamknuté hodnoty, ktoré aplikácie nemôžu prepísať. Po PHP2Shell pribúdajú prechodné opatrenia php.net, predovšetkým session.upload_progress.enabled=0. Bezpečná konfigurácia však nikdy nenahrádza aktualizáciu.

Prečo je php.ini po PHP2Shell opäť v centre pozornosti

php.ini je centrálny konfiguračný súbor PHP. Na mnohých serveroch sa raz nastavil a potom sa takmer nedotkol. S PHP2Shell sa to zmenilo: pre obe zraniteľnosti CVE-2026-109618 a CVE-2026-109619 uvádza php.net prechodné opatrenia, ktoré sa uplatňujú práve tu.

Samotné zraniteľnosti sídlia v interpreteri PHP. Opravené sú v PHP 8.5.12, 8.4.27, 8.3.36 a 8.2.35, zverejnených 21. 10. 2026. Dobrá konfigurácia napriek tomu pomáha dvoma spôsobmi: môže zneužitie sťažiť a obmedzuje škodu, ak sa predsa niečo prederie.

Mnohí prevádzkovatelia navyše presne nevedia, ktoré nastavenia na ich serveri platia. To je prvý krok.

Ktorá php.ini platí na vašom serveri?

PHP môže podľa prevádzkového režimu čítať rôzne konfiguračné súbory. Príkazový riadok, PHP-FPM a Apache s mod_php majú napríklad na Debiane a Ubuntu každé vlastný priečinok v /etc/php/<version>/. Kto zmení iba súbor pre CLI, na webe nezmení nič.

# Konfiguračné súbory príkazového riadka
php --ini
# Konfigurácia PHP-FPM (prispôsobiť číslo verzie)
php-fpm8.3 -i | grep -E "Loaded Configuration|Scan this dir"
# Skontrolovať jednotlivé hodnoty PHP-FPM
php-fpm8.3 -i | grep -E "^(expose_php|display_errors|session.upload_progress.enabled) "

Hodnoty môžu navyše byť uvedené v poole FPM, v konfigurácii Apache, v .htaccess (len mod_php) alebo v .user.ini (FPM a CGI). Ktorá verzia na serveri skutočne beží a či obsahuje backport, vyjasňuje príspevok Správne overiť verziu PHP a stav záplat.

Základné nastavenia pre vyššiu bezpečnosť php.ini

Nasledujúce hodnoty dávajú zmysel pre väčšinu produkčných serverov. Pred nasadením v testovacom prostredí overte, či si vaša aplikácia so všetkými hodnotami poradí.

; Žiadny údaj o verzii v hlavičke HTTP
expose_php = Off

; Chyby zaznamenávať, ale nikdy ich nezobrazovať v prehliadači
display_errors = Off
display_startup_errors = Off
log_errors = On
error_log = /var/log/php/error.log

; Nevkladať súbory zo vzdialených adries
allow_url_include = Off
; allow_url_fopen nechať aktívne len vtedy, ak ho aplikácia potrebuje
allow_url_fopen = Off

; Session: prísne, iba cez HTTPS, nečitateľné cez JavaScript
session.use_strict_mode = 1
session.use_only_cookies = 1
session.cookie_secure = 1
session.cookie_httponly = 1
session.cookie_samesite = Lax

; Obmedziť čas behu a vstupy
max_execution_time = 30
max_input_time = 60
max_input_vars = 1000

allow_url_fopen potrebujú niektoré aplikácie pre aktualizácie alebo rozhrania. Vypnite ho, len ak ste to predtým preverili. Funkcie, ktoré vykonávajú systémové príkazy, sa dajú navyše zablokovať; ako na to bez vedľajších účinkov, vysvetľuje príručka Správne používať disable_functions.

Prechodné opatrenia php.net k PHP2Shell

Ak nemôžete zaplátať okamžite, php.net uvádza niekoľko nastavení, ktoré znižujú riziko. Výslovne nejde o úplnú ochranu, ale o most do aktualizácie.

; Vypnúť session upload progress (aj kvôli CVE-2026-115560)
session.upload_progress.enabled = 0

; Obmedziť veľkosť požiadavky: 8M bez uploadov, 32M s uploadmi
post_max_size = 8M
upload_max_filesize = 6M

; Len PHP 8.5: žiadne backtrace pri závažných chybách
fatal_error_backtraces = 0

Okrem toho php.net odporúča nastaviť memory_limit=-1 tak, aby aplikácie túto hodnotu nemohli prepísať, a hranicu pamäte určiť radšej cez kontajner alebo cgroup, nie cez RLIMIT_AS alebo RLIMIT_DATA. Toto opatrenie patrí do poolu FPM alebo do konfigurácie servera a malo by sa skombinovať s funkčnou hranicou cgroup. Úplný prehľad nájdete na stránke Okamžité opatrenia, ak ešte nemôžete záplatovať.

Dôležité

session.upload_progress.enabled=0 pôsobí iba z php.ini, poolu FPM alebo konfigurácie servera. Ak sa nastaví cez ini_set() alebo .user.ini, opatrenie nezaberie. Potom reštartujte všetkých workerov.

Zamknúť hodnoty proti prepísaniu

Mnohé aplikácie nastavujú vlastné hodnoty, napríklad pre pamäť alebo uploady. Pomocou php_admin_value a php_admin_flag určíte nastavenia tak, aby ich nemohlo zmeniť ani ini_set(), ani .user.ini. V poole FPM to vyzerá takto:

; /etc/php/8.3/fpm/pool.d/meine-seite.conf (výťah)
php_admin_flag[display_errors] = off
php_admin_flag[session.upload_progress.enabled] = off
php_admin_value[memory_limit] = -1
php_admin_value[post_max_size] = 8M
php_admin_value[upload_max_filesize] = 6M
php_admin_value[error_log] = /var/log/php/meine-seite.error.log

V Apache s mod_php platí rovnaká logika s php_admin_value a php_admin_flag v konfigurácii VirtualHost. Potom službu znova načítajte a aktívnu hodnotu overte:

sudo systemctl reload php8.3-fpm
# Čas štartu procesov: je po zmene?
ps -eo pid,lstart,cmd | grep "[p]hp-fpm"

Reload reštartuje workerov PHP-FPM. Po aktualizácii PHP je naproti tomu potrebný úplný reštart všetkých procesov PHP, aby v pamäti nepokračoval starý proces. Pri viacerých weboch na jednom serveri sa navyše oplatí samostatný pool pre každý web, viac v príručke open_basedir a izolácia pre každý web.

Časté chyby a krátky kontrolný zoznam

Väčšina problémov s php.ini nevzniká nesprávnymi hodnotami, ale hodnotami na nesprávnom mieste. Typický je zmenený súbor CLI, kým web beží cez PHP-FPM. Rovnako často po zmene chýba reštart alebo hostingový panel pri ďalšom uložení prepíše vlastné nastavenie.

Druhým klasickým prípadom sú viditeľné chybové hlásenia na živom webe. Prezrádzajú cesty, názvy databáz alebo verzie a uľahčujú útočníkom orientáciu. Práve po sťahovaní alebo novej inštalácii býva display_errors opäť na On.

Tieto body by ste mali skontrolovať po každej zmene a po každej aktualizácii PHP:

  1. Ktorý konfiguračný súbor číta webový prevádzkový režim a obsahuje vaše hodnoty?
  2. Sú display_errors a expose_php vypnuté, je do chybového logu možné zapisovať?
  3. Je session.upload_progress.enabled nastavené na 0 cez php.ini alebo pool?
  4. Sú veľkosti uploadov a požiadaviek obmedzené primerane aplikácii?
  5. Bežia všetky procesy PHP s časom štartu po poslednej zmene?

Výsledok zaznamenajte s dátumom. Tak sa neskôr dá doložiť, kedy ktoré nastavenie platilo.

Ako konkrétne pomáha PHP SOS?

  • Zisťujeme, ktorá konfigurácia je v ktorom prevádzkovom režime skutočne aktívna.
  • Nastavíme zosúladenú základnú konfiguráciu a prechodné opatrenia k PHP2Shell, otestované s vašou aplikáciou.
  • Bezpečnostne relevantné hodnoty zamkneme proti prepísaniu a všetkých workerov kontrolovane reštartujeme.
  • Nastavenia a výsledok kontroly zdokumentujeme, aby neskoršie zmeny zostali dohľadateľné.

Ako vyzerá trvalé zabezpečenie, popisuje služba Spevnenie servera pre webové servery PHP.

Časté otázky

Ktorú php.ini vlastne používa môj webový server?

Často nie je rovnaká ako v príkazovom riadku. PHP-FPM, Apache s mod_php a CLI majú spravidla vlastné konfiguračné priečinky. Aktívny súbor preto zisťujte cez príslušný prevádzkový režim, napríklad pomocou php-fpm -i alebo krátkodobo uloženého kontrolného súboru.

Nahrádza bezpečná php.ini aktualizáciu PHP?

Nie. Nastavenia zmenšujú útočnú plochu a sťažujú zneužitie, ale neuzatvárajú zraniteľnosť v interpreteri PHP. Ani prechodné opatrenia php.net k PHP2Shell nie sú výslovne úplnou ochranou.

Aký je rozdiel medzi php_value a php_admin_value?

Hodnoty nastavené cez php_value môže aplikácia za behu opäť zmeniť. Hodnoty cez php_admin_value v poole FPM alebo v konfigurácii Apache sú naopak pre aplikáciu zamknuté, aj pre ini_set() a .user.ini.

Musím po zmene php.ini reštartovať?

Áno. PHP-FPM a Apache s mod_php čítajú konfiguráciu iba pri štarte. Nové hodnoty platia až po reštarte alebo reloade všetkých dotknutých služieb.

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