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_admin_value: zablokovanie nastavení proti prepísaniu

Bezpečnostné nastavenie je na málo, ak ho aplikácia jedným riadkom kódu znova zmení. Pomocou php_admin_value a php_admin_flag určíte hodnoty pre PHP-FPM a Apache záväzne.

Stav 5 min čítaniaHardening a konfigurácia

Stručne: php_admin_value a php_admin_flag nastavujú nastavenia PHP v poole PHP-FPM alebo v konfigurácii Apache tak, aby ich aplikácie nemohli zmeniť ani cez ini_set(), ani cez .htaccess. Presne to php.net vyžaduje pre prechodné opatrenia k PHP2Shell, napríklad pre memory_limit=-1. Po nastavení sa musí služba reštartovať a hodnota by sa mala overiť vo webovom kontexte.

Prečo „nastavené“ neznamená „zablokované“

V dňoch po 21. októbri 2026 mnohí administrátori zapísali prechodné opatrenia php.net do svojho php.ini. Jeden detail odporúčania pritom často zapadol: memory_limit=-1 má byť nastavené tak, aby ho aplikácie nemohli prepísať. php.net na to výslovne uvádza php_admin_value v poole FPM alebo v konfigurácii Apache.

Dôvod je jednoduchý. Mnohé CMS, e-shopy a frameworky nastavujú vlastné hodnoty, napríklad vyšší pamäťový limit pre importy. Ak je hodnota len v php.ini, aplikácia ju pri najbližšom otvorení prepíše. Ochranné opatrenie potom existuje na papieri, ale nie v bežiacom procese.

Netýka sa to len PHP2Shell. Každé sprísnenie, od vypnutých chybových výstupov až po limity uploadu, je také silné ako jeho najslabšia úroveň.

Kto môže nastavenia PHP vôbec meniť

PHP pozná štyri režimy zmeny. Každé nastavenie má jeden z nich a určuje, na ktorých miestach sa dá nastaviť. Významy pochádzajú z príručky PHP.

Režim Kde možno hodnotu nastaviť Príklady
INI_USER v skripte cez ini_set() a v .user.ini niekoľko behových hodnôt
INI_PERDIR php.ini, .htaccess, httpd.conf, .user.ini post_max_size, session.upload_progress.enabled
INI_SYSTEM len php.ini alebo httpd.conf file_uploads, disable_functions
INI_ALL všade, aj cez ini_set() memory_limit, display_errors, open_basedir

Nebezpečné sú predovšetkým hodnoty INI_ALL: dajú sa zmeniť z ktoréhokoľvek skriptu. Hodnoty INI_PERDIR sa cez ini_set() zmeniť nedajú, dajú sa však zmeniť cez .htaccess pri mod_php alebo cez .user.ini pri PHP-FPM. Kto má práva na zápis vo webovom koreni, teda aj votknutý kód, môže takéto súbory vytvoriť.

php_admin_value v poole FPM a v Apache

Pri PHP-FPM sú hodnoty v súbore poolu. Príručka PHP uvádza: hodnoty nastavené pomocou php_admin_value a php_admin_flag sa nedajú prepísať cez ini_set(). Pre hodnoty zapnuté/vypnuté použite php_admin_flag, pre všetky ostatné php_admin_value.

; /etc/php/8.3/fpm/pool.d/seite1.conf (výňatok)
[seite1]
user = seite1
group = seite1
listen = /run/php/seite1.sock

php_admin_value[memory_limit] = -1
php_admin_value[post_max_size] = 32M
php_admin_value[upload_max_filesize] = 24M
php_admin_flag[session.upload_progress.enabled] = off
php_admin_flag[display_errors] = off
php_admin_value[error_log] = /var/log/php/seite1-fehler.log
php_admin_value[open_basedir] = /var/www/seite1/:/tmp/seite1/

memory_limit=-1 patrí podľa php.net do konfigurácie len spolu s pamäťovou hranicou cez kontajner alebo cgroup. Ako sa to darí so systemd, uvádza príspevok Nastavenie pamäťových hraníc pomocou systemd a cgroups.

Pri Apache s mod_php patria direktívy do konfigurácie servera alebo do VirtualHost. Podľa príručky PHP nie sú v .htaccess povolené a po nastavení ich nemôže zmeniť ani .htaccess, ani ini_set().

<VirtualHost *:443>
    ServerName www.example.de
    DocumentRoot /var/www/seite1/public
    <IfModule php_module>
        php_admin_value memory_limit -1
        php_admin_value post_max_size 32M
        php_admin_value upload_max_filesize 24M
        php_admin_flag session.upload_progress.enabled off
        php_admin_flag display_errors off
    </IfModule>
</VirtualHost>

Dve jemnosti z príručky: ak chcete zmazať predtým nastavenú hodnotu, použite none ako hodnotu. A konštanty PHP ako E_ALL nemajú v konfigurácii Apache význam; pre error_reporting tam musíte uviesť číselnú hodnotu.

Ktoré hodnoty by ste mali zablokovať

Nie každé nastavenie musí byť zablokované. Zmysluplné je to pre všetko, čo sa týka bezpečnosti alebo slúži ako prechodné opatrenie:

  1. Prechodné hodnoty php.net k PHP2Shell: memory_limit, post_max_size, upload_max_filesize, session.upload_progress.enabled a pri PHP 8.5 fatal_error_backtraces.
  2. Výstup chýb a zapisovanie do protokolu: display_errors, display_startup_errors, log_errors, error_log.
  3. Prístup k súborom a izolácia: open_basedir, upload_tmp_dir, session.save_path.
  4. Sieťové prístupy z PHP: allow_url_include a, ak ho aplikácia nepotrebuje, allow_url_fopen.
  5. Zablokované funkcie cez disable_functions, ktoré v poole podľa príručky dopĺňajú zoznam z php.ini a nenahrádzajú ho. Podrobnosti v sprievodcovi Správne nasadenie disable_functions.

Pri session.upload_progress.enabled je blokovanie obzvlášť dôležité, pretože hodnotu by sa inak dalo cez .user.ini znova zapnúť. Viac v príspevku Vypnutie session.upload_progress: správne a trvalo.

Overiť, či blokovanie platí

Po každej zmene reštartujte službu a overte hodnotu vo webovom kontexte. Krátky, okamžite zmazaný kontrolný súbor ukáže, či pool hodnotu drží, aj keď ju chce aplikácia zmeniť:

<?php
// Kontrolný súbor: nakrátko uložiť, raz otvoriť cez doménu, okamžite zmazať
header('Content-Type: text/plain');
$vorher = ini_get('memory_limit');
$versuch = @ini_set('memory_limit', '256M');
echo "memory_limit: $vorher\n";
echo 'Änderung per ini_set() ', ($versuch === false ? 'blockiert' : 'MÖGLICH'), "\n";

Očakáva sa -1 a „blockiert“. Ak je výstup „MÖGLICH“, hodnota nie je nastavená cez php_admin_value alebo služba ešte nebola reštartovaná. Kontrolu zopakujte pre každý pool a každú verziu PHP.

Tip

Zablokované hodnoty udržiavajte centrálne, napríklad v šablóne poolu alebo vo vašej správe konfigurácie. Hostingové panely niekedy ručne zmenené súbory poolov pri najbližšom uložení prepíšu; tam patria hodnoty do polí určených panelom.

Ako PHP usporadúva svoje úrovne konfigurácie ako celok, vysvetľuje php.ini vysvetlený: štruktúra, úrovne a priorita. Úplné prechodné opatrenia sú pri Okamžité opatrenia, ak ešte nemôžete záplatovať.

Záver: až zablokované je skutočne nastavené

Prechodné opatrenia php.net k PHP2Shell posunuli do povedomia rozlíšenie, ktoré sa predtým často prehliadalo: hodnota v php.ini je pri mnohých nastaveniach len návrh, hodnota v php_admin_value je záväzné zadanie. Pri komfortných hodnotách, ako je časové pásmo, je rozdiel nepodstatný. Pri bezpečnostných nastaveniach a prechodných opatreniach rozhoduje o tom, či opatrenie v bežnej prevádzke vôbec zaberá.

Námaha je prehľadná: hŕstka riadkov na pool alebo VirtualHost, reštart, krátka kontrola. Zoznam zablokovaných hodnôt držte malý a odôvodnený, aby vývojári dokázali pochopiť, prečo ich aplikácia nesmie hodnotu meniť. A zoznam udržiavajte vo svojich šablónach, aby ho nové weby dedili automaticky.

Ako konkrétne pomáha PHP SOS?

  • Prečítať úrovne: pre každý web zistíme, ktoré hodnoty z php.ini, poolu, Apache, .htaccess alebo .user.ini skutočne platia.
  • Nastaviť blokovanie: hodnoty relevantné pre bezpečnosť a prechodné opatrenia k PHP2Shell zapíšeme ako php_admin_value resp. php_admin_flag a služby reštartujeme.
  • Otestovať aplikáciu: overíme, či aplikácia beží so zablokovanými hodnotami bez chýb, a vyhodnotíme chybový protokol.
  • Udržiavať šablóny: v rámci sprísnenia servera hodnoty prevezmeme do šablón poolov a dokumentácie.

Časté otázky

Aký je rozdiel medzi php_value a php_admin_value?

Obe nastavujú nastavenie PHP. Hodnoty z php_value môže aplikácia neskôr znova zmeniť, napríklad cez ini_set() alebo .htaccess. Hodnoty z php_admin_value a php_admin_flag sú podľa príručky PHP zablokované pre ini_set(), pri Apache aj pre .htaccess.

Môžem php_admin_value zapísať do súboru .htaccess?

Nie. Podľa príručky PHP nie je php_admin_value v súboroch .htaccess povolené. Patrí do konfigurácie servera Apache alebo do VirtualHost, pri PHP-FPM do súboru poolu.

Čo sa stane, ak chce aplikácia zmeniť zablokovanú hodnotu?

Volanie ini_set() zlyhá a vráti false, zablokovaná hodnota zostane zachovaná. Dobre naprogramované aplikácie sa s tým vyrovnajú. Po prechode napriek tomu skontrolujte chybový protokol a najdôležitejšie funkcie.

Musím po zmene v poole reštartovať?

Áno. PHP-FPM číta súbory poolov pri štarte alebo pri opätovnom načítaní služby. Pri Apache s mod_php platí to isté pre konfiguráciu servera. Bez reštartu beží stará hodnota ďalej.

Dá sa disable_functions v poole rozšíriť?

Áno, s jednou zvláštnosťou: podľa príručky PHP disable_functions v poole FPM hodnoty z php.ini neprepisuje, ale dopĺňa. Pool teda môže zablokovať ďalšie funkcie, ale žiadne neuvoľní.

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