# php_admin_value: zablokovanie nastavení proti prepísaniu

> php_admin_value a php_admin_flag vysvetlené: ako hodnoty PHP v poole FPM a Apache zablokujete proti ini_set(), .htaccess a .user.ini a ako to overiť.

Zdroj: https://phpsos.de/sk/blog/php-admin-value-sperren/  
Stav: 25.10.2026  
Poskytovateľ: PHP SOS, Núdzová pomoc pri PHP a bezpečnosť serverov. Okamžitá pomoc cez WhatsApp: https://wa.me/491736494914?text=Dobr%C3%BD%20de%C5%88%2C%20PHP%20SOS%2C%20potrebujeme%20pomoc%20s%20na%C5%A1%C3%ADm%20serverom%20s%20PHP.%20Spolo%C4%8Dnos%C5%A5%3A%20%E2%80%A6%20Web%3A%20%E2%80%A6

**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`.

```ini
; /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](https://phpsos.de/sk/blog/speichergrenzen-systemd-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()`.

```apache
<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](https://phpsos.de/sk/ratgeber/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](https://phpsos.de/sk/blog/session-upload-progress-abschalten/).

## 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
<?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](https://phpsos.de/sk/php/php-ini-erklaert/). Úplné prechodné opatrenia sú pri [Okamžité opatrenia, ak ešte nemôžete záplatovať](https://phpsos.de/sk/php2shell/sofortmassnahmen-ohne-patch/).

## 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](https://phpsos.de/sk/leistungen/server-haertung/) 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

- [Príručka PHP: konfigurácia FPM](https://www.php.net/manual/en/install.fpm.configuration.php)
- [Príručka PHP: zmena konfigurácie](https://www.php.net/manual/en/configuration.changes.php)
- [Príručka PHP: režimy zmeny nastavení](https://www.php.net/manual/en/configuration.changes.modes.php)
- [php.net: bezpečnostné správy](https://www.php.net/)
