# php_admin_value: sätete kaitsmine ülekirjutamise eest

> php_admin_value ja php_admin_flag selgitus: kuidas lukustada PHP väärtused FPM-poolis ja Apache'is ini_set(), .htaccess ja .user.ini vastu.

Allikas: https://phpsos.de/et/blog/php-admin-value-sperren/  
Seis: 25.10.2026  
Pakkuja: PHP SOS, PHP hädaabi ja serveri turvalisus. Kohene abi WhatsAppis: https://wa.me/491736494914?text=Tere%2C%20PHP%20SOS%2C%20vajame%20abi%20oma%20PHP-serveriga.%20Ettev%C3%B5te%3A%20%E2%80%A6%20Veebisait%3A%20%E2%80%A6

**Lühidalt:** `php_admin_value` ja `php_admin_flag` seavad PHP sätted PHP-FPM-poolis või Apache'i konfiguratsioonis nii, et rakendused ei saa neid muuta ei käsuga `ini_set()` ega faili `.htaccess` kaudu. Just seda nõuab php.net PHP2Shelli üleminekumeetmete jaoks, näiteks `memory_limit=-1` puhul. Pärast seadmist peab teenus taaskäivituma ja väärtust tuleks kontrollida veebikontekstis.

## Miks „seatud“ ei tähenda „lukustatud“

21. oktoobrile 2026 järgnenud päevil kirjutasid paljud administraatorid php.net'i üleminekumeetmed oma faili php.ini. Soovituse üks üksikasi jäi seejuures sageli märkamata: `memory_limit=-1` peab olema seatud nii, et rakendused ei saa seda üle kirjutada. php.net nimetab selleks otsesõnu `php_admin_value` FPM-poolis või Apache'i konfiguratsioonis.

Põhjus on lihtne. Paljud CMS-id, poed ja raamistikud seavad oma väärtused, näiteks kõrgema mälupiiri importide jaoks. Kui väärtus on ainult failis php.ini, kirjutab rakendus selle järgmisel päringul üle. Kaitsemeede eksisteerib siis paberil, kuid mitte töötavas protsessis.

See ei puuduta ainult PHP2Shelli. Iga karastamine, väljalülitatud veaväljundist üleslaadimispiirideni, on nii tugev kui selle nõrgim tasand.

## Kes PHP sätteid üldse muuta tohib

PHP-l on neli muutmisrežiimi. Igal sättel on neist üks ja see määrab, millistes kohtades seda saab seada. Tähendused pärinevad PHP käsiraamatust.

| Režiim | Kus väärtust saab seada | Näited |
|---|---|---|
| `INI_USER` | skriptis käsuga `ini_set()` ja failis `.user.ini` | mõned käitusaja väärtused |
| `INI_PERDIR` | php.ini, `.htaccess`, `httpd.conf`, `.user.ini` | `post_max_size`, `session.upload_progress.enabled` |
| `INI_SYSTEM` | ainult php.ini või `httpd.conf` | `file_uploads`, `disable_functions` |
| `INI_ALL` | kõikjal, ka käsuga `ini_set()` | `memory_limit`, `display_errors`, `open_basedir` |

Ohtlikud on eelkõige `INI_ALL`-väärtused: neid saab muuta igast skriptist. `INI_PERDIR`-väärtusi ei saa küll käsuga `ini_set()` muuta, küll aga mod_php puhul `.htaccess` või PHP-FPM-i puhul `.user.ini` kaudu. Kellel on kirjutusõigused veebijuurkataloogis, seega ka sissetoodud koodil, saab selliseid faile luua.

## php_admin_value FPM-poolis ja Apache'is

PHP-FPM-i puhul asuvad väärtused pooli failis. PHP käsiraamat märgib: käskudega `php_admin_value` ja `php_admin_flag` seatud väärtusi ei saa käsuga `ini_set()` üle kirjutada. Sisse-välja-väärtuste jaoks kasutage `php_admin_flag`, kõigi teiste jaoks `php_admin_value`.

```ini
; /etc/php/8.3/fpm/pool.d/seite1.conf (väljavõte)
[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` kuulub php.net'i järgi konfiguratsiooni ainult koos mälupiiriga konteineri või cgroup'i kaudu. Kuidas see systemd-ga õnnestub, on kirjas artiklis [Mälupiiride seadmine systemd ja cgroup'idega](https://phpsos.de/et/blog/speichergrenzen-systemd-cgroups/).

Apache'is mod_php-ga kuuluvad direktiivid serverikonfiguratsiooni või VirtualHosti. PHP käsiraamatu järgi ei ole need failis `.htaccess` lubatud ja kord seatuna ei saa neid muuta ei `.htaccess` ega `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>
```

Kaks käsiraamatu peensust: varem seatud väärtuse kustutamiseks kasutage väärtusena `none`. Ja PHP konstandid nagu `E_ALL` ei oma Apache'i konfiguratsioonis tähendust; `error_reporting` jaoks tuleb seal anda arvväärtus.

## Milliseid väärtusi peaksite lukustama

Mitte iga säte ei pea olema lukustatud. Mõistlik on see kõige jaoks, mis puudutab turvalisust või mis on üleminekumeede:

1. php.net'i PHP2Shelli üleminekuväärtused: `memory_limit`, `post_max_size`, `upload_max_filesize`, `session.upload_progress.enabled` ja PHP 8.5-s `fatal_error_backtraces`.
2. Veaväljund ja protokollimine: `display_errors`, `display_startup_errors`, `log_errors`, `error_log`.
3. Faililigipääs ja eraldatus: `open_basedir`, `upload_tmp_dir`, `session.save_path`.
4. Võrgujuurdepääsud PHP-st: `allow_url_include` ja, kui rakendus seda ei vaja, `allow_url_fopen`.
5. Käsuga `disable_functions` blokeeritud funktsioonid, mis täiendavad poolis käsiraamatu järgi php.ini loendit, mitte ei asenda seda. Üksikasjad juhendis [disable_functions õige kasutamine](https://phpsos.de/et/ratgeber/disable-functions/).

`session.upload_progress.enabled` puhul on lukustamine eriti oluline, sest muidu võiks väärtuse `.user.ini` kaudu uuesti sisse lülitada. Rohkem artiklis [session.upload_progress väljalülitamine: õigesti ja püsivalt](https://phpsos.de/et/blog/session-upload-progress-abschalten/).

## Kontrollimine, kas lukk toimib

Käivitage teenus pärast iga muudatust uuesti ja kontrollige väärtust veebikontekstis. Lühike, kohe jälle kustutatud kontrollfail näitab, kas pool hoiab väärtust ka siis, kui rakendus tahab seda muuta:

```php
<?php
// Kontrollfail: pange korraks, avage üks kord domeeni kaudu, kustutage kohe
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";
```

Oodatav on `-1` ja „blockiert“. Kui väljund on „MÖGLICH“, ei ole väärtus seatud käsuga `php_admin_value` või teenust pole veel taaskäivitatud. Korrake kontrolli iga pooli ja iga PHP versiooni jaoks.

> **Näpunäide:**
> Hoidke lukustatud väärtusi keskselt, näiteks pooli mallis või konfiguratsioonihalduses. Majutuspaneelid kirjutavad käsitsi muudetud pooli failid osaliselt järgmisel salvestamisel üle; seal kuuluvad väärtused paneeli ettenähtud väljadele.

Kuidas PHP oma konfiguratsioonitasandeid tervikuna korraldab, selgitab [php.ini selgitus: ülesehitus, tasandid ja eesõigus](https://phpsos.de/et/php/php-ini-erklaert/). Täielikud üleminekumeetmed on lehel [Kiirmeetmed, kui te ei saa veel paikama hakata](https://phpsos.de/et/php2shell/sofortmassnahmen-ohne-patch/).

## Kokkuvõte: alles lukustatult on seatud tõeliselt

php.net'i PHP2Shelli üleminekumeetmed on teadvustanud vahet, mida varem sageli märgati: väärtus failis php.ini on paljude sätete puhul vaid ettepanek, väärtus käsuga `php_admin_value` on ettekirjutus. Mugavusväärtuste, nagu ajavöönd, puhul pole vahe oluline. Turvasätete ja üleminekumeetmete puhul otsustab see, kas meede töötavas süsteemis üldse mõjub.

Vaev on ülevaadatav: peotäis ridu pooli või VirtualHosti kohta, üks taaskäivitus, üks lühike kontroll. Hoidke lukustatud väärtuste loend väike ja põhjendatud, et arendajad saaksid aru, miks nende rakendus väärtust muuta ei tohi. Ja hooldage loendit oma mallides, et uued veebisaidid selle automaatselt pärivad.

## Kuidas PHP SOS konkreetselt aitab?

- **Tasandid välja lugeda:** selgitame iga veebisaidi kohta, millised väärtused failidest php.ini, pool, Apache, `.htaccess` või `.user.ini` tegelikult kehtivad.
- **Lukud seada:** turvaolulised väärtused ja PHP2Shelli üleminekumeetmed kanname sisse käskudena `php_admin_value` või `php_admin_flag` ning taaskäivitame teenused.
- **Rakendust testida:** kontrollime, kas rakendus töötab lukustatud väärtustega veatult, ja analüüsime vealogi.
- **Malle hooldada:** [serveri karastamise](https://phpsos.de/et/leistungen/server-haertung/) raames võtame väärtused üle pooli mallidesse ja dokumentatsiooni.


## Korduma kippuvad küsimused

**Mis vahe on php_value'l ja php_admin_value'l?**  
Mõlemad seavad PHP sätte. php_value väärtusi saab rakendus hiljem uuesti muuta, näiteks käsuga ini_set() või failis .htaccess. php_admin_value ja php_admin_flag väärtused on PHP käsiraamatu järgi ini_set() jaoks lukustatud, Apache'is ka .htaccess jaoks.

**Kas tohin php_admin_value kirjutada .htaccess-faili?**  
Ei. PHP käsiraamatu järgi ei ole php_admin_value .htaccess-failides lubatud. See kuulub Apache'i serverikonfiguratsiooni või VirtualHosti, PHP-FPM-i puhul pooli faili.

**Mis juhtub, kui rakendus tahab lukustatud väärtust muuta?**  
Käsu ini_set() kutse ebaõnnestub ja tagastab false, lukustatud väärtus jääb kehtima. Hästi programmeeritud rakendused saavad sellega hakkama. Kontrollige pärast ümberlülitust siiski vealogi ja tähtsamaid funktsioone.

**Kas pean pärast pooli muutmist taaskäivitama?**  
Jah. PHP-FPM loeb pooli faile käivitamisel või teenuse uuesti laadimisel. Apache'is mod_php-ga kehtib sama serverikonfiguratsiooni kohta. Ilma taaskäivituseta jätkab vana väärtus.

**Kas disable_functions'i saab poolis laiendada?**  
Jah, ühe iseärasusega: PHP käsiraamatu järgi ei kirjuta disable_functions FPM-poolis php.ini väärtusi üle, vaid täiendab neid. Pool saab seega lisafunktsioone blokeerida, kuid ühtegi vabastada ei saa.

## Allikad

- [PHP käsiraamat: FPM-i konfiguratsioon](https://www.php.net/manual/en/install.fpm.configuration.php)
- [PHP käsiraamat: konfiguratsiooni muutmine](https://www.php.net/manual/en/configuration.changes.php)
- [PHP käsiraamat: sätete muutmisrežiimid](https://www.php.net/manual/en/configuration.changes.modes.php)
- [php.net: turvateated](https://www.php.net/)
