# php_admin_value: nustatymų užrakinimas nuo perrašymo

> php_admin_value ir php_admin_flag paaiškinimas: kaip užrakinti PHP reikšmes FPM baseine ir Apache nuo ini_set(), .htaccess ir .user.ini bei tai patikrinti.

Šaltinis: https://phpsos.de/lt/blog/php-admin-value-sperren/  
Būsena: 2026-10-25  
Teikėjas: PHP SOS, PHP avarinė pagalba ir serverio sauga. Skubi pagalba per „WhatsApp“: https://wa.me/491736494914?text=Sveiki%2C%20PHP%20SOS%2C%20mums%20reikia%20pagalbos%20su%20m%C5%ABs%C5%B3%20PHP%20serveriu.%20%C4%AEmon%C4%97%3A%20%E2%80%A6%20Svetain%C4%97%3A%20%E2%80%A6

**Trumpai:** `php_admin_value` ir `php_admin_flag` nustato PHP nustatymus PHP-FPM baseine arba Apache konfigūracijoje taip, kad programos jų negalėtų pakeisti nei per `ini_set()`, nei per `.htaccess`. Būtent to php.net reikalauja PHP2Shell pereinamosioms priemonėms, pavyzdžiui, `memory_limit=-1`. Nustačius paslaugą reikia paleisti iš naujo, o reikšmę verta patikrinti žiniatinklio kontekste.

## Kodėl „nustatyta“ nereiškia „užrakinta“

Per dienas po 2026 m. spalio 21 d. daugelis administratorių php.net pereinamąsias priemones įrašė į savo php.ini. Viena rekomendacijos detalė dažnai pasimetė: `memory_limit=-1` turi būti nustatytas taip, kad programos negalėtų jo perrašyti. php.net tam aiškiai nurodo `php_admin_value` FPM baseine arba Apache konfigūracijoje.

Priežastis paprasta. Daugelis CMS, parduotuvių ir karkasų nustato savas reikšmes, pavyzdžiui, didesnę atminties ribą importams. Jei reikšmė yra tik php.ini, programa ją perrašo per kitą kreipinį. Tada apsaugos priemonė egzistuoja popieriuje, bet ne veikiančiame procese.

Tai liečia ne tik PHP2Shell. Kiekvienas sutvirtinimas, nuo išjungtų klaidų išvedimų iki įkėlimo ribų, yra tiek stiprus, kiek stiprus jo silpniausias lygmuo.

## Kas apskritai gali keisti PHP nustatymus

PHP turi keturis keitimo režimus. Kiekvienas nustatymas turi vieną iš jų, ir jis lemia, kuriose vietose nustatymą galima nustatyti. Reikšmės paimtos iš PHP vadovo.

| Režimas | Kur reikšmę galima nustatyti | Pavyzdžiai |
|---|---|---|
| `INI_USER` | scenarijuje per `ini_set()` ir `.user.ini` | kelios vykdymo reikšmės |
| `INI_PERDIR` | php.ini, `.htaccess`, `httpd.conf`, `.user.ini` | `post_max_size`, `session.upload_progress.enabled` |
| `INI_SYSTEM` | tik php.ini arba `httpd.conf` | `file_uploads`, `disable_functions` |
| `INI_ALL` | visur, taip pat per `ini_set()` | `memory_limit`, `display_errors`, `open_basedir` |

Pavojingiausios yra `INI_ALL` reikšmės: jas galima pakeisti iš bet kurio scenarijaus. `INI_PERDIR` reikšmių per `ini_set()` pakeisti negalima, bet galima per `.htaccess` su mod_php arba `.user.ini` su PHP-FPM. Kas turi rašymo teises žiniatinklio šakniniame kataloge, taigi ir įterptas kodas, gali sukurti tokius failus.

## php_admin_value FPM baseine ir Apache

PHP-FPM reikšmės yra baseino faile. PHP vadovas nurodo: su `php_admin_value` ir `php_admin_flag` nustatytų reikšmių negalima perrašyti per `ini_set()`. Įjungimo-išjungimo reikšmėms naudokite `php_admin_flag`, visoms kitoms `php_admin_value`.

```ini
; /etc/php/8.3/fpm/pool.d/seite1.conf (ištrauka)
[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/
```

Pasak php.net, `memory_limit=-1` į konfigūraciją priklauso tik kartu su atminties riba per konteinerį ar cgroup. Kaip tai pavyksta su systemd, aprašyta straipsnyje [Atminties ribų nustatymas su systemd ir cgroups](https://phpsos.de/lt/blog/speichergrenzen-systemd-cgroups/).

Apache su mod_php direktyvos priklauso serverio konfigūracijai arba VirtualHost. Pasak PHP vadovo, `.htaccess` jos neleidžiamos, o kartą nustatytų nei `.htaccess`, nei `ini_set()` pakeisti negali.

```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>
```

Dvi smulkmenos iš vadovo: norėdami ištrinti anksčiau nustatytą reikšmę, kaip reikšmę naudokite `none`. O PHP konstantos, tokios kaip `E_ALL`, Apache konfigūracijoje neturi prasmės; `error_reporting` ten reikia nurodyti skaitinę reikšmę.

## Kurias reikšmes užrakinti

Ne kiekvieną nustatymą reikia užrakinti. Prasminga tai daryti viskam, kas liečia saugumą arba tarnauja kaip pereinamoji priemonė:

1. php.net PHP2Shell pereinamosios reikšmės: `memory_limit`, `post_max_size`, `upload_max_filesize`, `session.upload_progress.enabled` ir PHP 8.5 `fatal_error_backtraces`.
2. Klaidų išvedimas ir registravimas: `display_errors`, `display_startup_errors`, `log_errors`, `error_log`.
3. Prieiga prie failų ir izoliacija: `open_basedir`, `upload_tmp_dir`, `session.save_path`.
4. Tinklo kreipiniai iš PHP: `allow_url_include` ir, jei programa to nereikalauja, `allow_url_fopen`.
5. Užblokuotos funkcijos per `disable_functions`, kurios baseine, pasak vadovo, papildo php.ini sąrašą, o ne jį pakeičia. Detales rasite gide [disable_functions teisingas naudojimas](https://phpsos.de/lt/ratgeber/disable-functions/).

Su `session.upload_progress.enabled` užrakinimas ypač svarbus, nes kitaip reikšmė galėtų būti vėl įjungta per `.user.ini`. Daugiau apie tai skyriuje [session.upload_progress išjungimas: teisingai ir visam laikui](https://phpsos.de/lt/blog/session-upload-progress-abschalten/).

## Patikrinti, ar užraktas veikia

Po kiekvieno pakeitimo paslaugą paleiskite iš naujo ir patikrinkite reikšmę žiniatinklio kontekste. Trumpas, iš karto vėl ištrinamas patikros failas parodo, ar baseinas išlaiko reikšmę, net kai programa nori ją pakeisti:

```php
<?php
// Patikros failas: padėti trumpam, vieną kartą iškviesti per domeną, iš karto ištrinti
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";
```

Tikimasi `-1` ir „blockiert“ (užblokuota). Jei išvestis „MÖGLICH“ (įmanoma), reikšmė nenustatyta per `php_admin_value` arba paslauga dar nepaleista iš naujo. Patikrą pakartokite kiekvienam baseinui ir kiekvienai PHP versijai.

> **Patarimas:**
> Užrakintas reikšmes laikykite centralizuotai, pavyzdžiui, baseino šablone ar konfigūracijos valdyme. Hostingo skydeliai kartais perrašo rankiniu būdu pakeistus baseino failus kitą kartą išsaugodami; ten reikšmės priklauso skydelio numatytiems laukams.

Kaip PHP apskritai tvarko savo konfigūracijos lygius, paaiškina [php.ini paaiškinimas: sandara, lygiai ir pirmenybė](https://phpsos.de/lt/php/php-ini-erklaert/). Visos pereinamosios priemonės pateiktos skyriuje [Skubios priemonės, kai dar negalite pataisyti](https://phpsos.de/lt/php2shell/sofortmassnahmen-ohne-patch/).

## Išvada: tik užrakinta reikšmė iš tikrųjų nustatyta

php.net pereinamosios priemonės dėl PHP2Shell atkreipė dėmesį į skirtumą, kuris anksčiau dažnai būdavo nepastebimas: reikšmė php.ini daugeliui nustatymų yra tik pasiūlymas, o reikšmė `php_admin_value` yra nurodymas. Patogumo reikšmėms, tokioms kaip laiko zona, skirtumas nesvarbus. Saugumo nustatymams ir pereinamosioms priemonėms jis lemia, ar priemonė apskritai veikia einamuoju režimu.

Darbo kiekis nedidelis: saujelė eilučių kiekvienam baseinui ar VirtualHost, paleidimas iš naujo, trumpa patikra. Užrakintų reikšmių sąrašą laikykite mažą ir pagrįstą, kad kūrėjai suprastų, kodėl jų programa negali pakeisti reikšmės. Ir prižiūrėkite sąrašą savo šablonuose, kad naujos svetainės jį paveldėtų automatiškai.

## Kaip PHP SOS padeda konkrečiai?

- **Nuskaityti lygius:** kiekvienai svetainei nustatome, kurios reikšmės iš php.ini, baseino, Apache, `.htaccess` ar `.user.ini` iš tikrųjų galioja.
- **Nustatyti užraktus:** saugumui svarbias reikšmes ir PHP2Shell pereinamąsias priemones įrašome kaip `php_admin_value` arba `php_admin_flag` ir iš naujo paleidžiame paslaugas.
- **Išbandyti programą:** tikriname, ar programa su užrakintomis reikšmėmis veikia be klaidų, ir analizuojame klaidų žurnalą.
- **Prižiūrėti šablonus:** [serverio sutvirtinimo](https://phpsos.de/lt/leistungen/server-haertung/) rėmuose reikšmes perkeliame į baseinų šablonus ir dokumentaciją.


## Dažni klausimai

**Kuo skiriasi php_value ir php_admin_value?**  
Abu nustato PHP nustatymą. Reikšmes iš php_value programa vėliau gali vėl pakeisti, pavyzdžiui, per ini_set() ar .htaccess. Pasak PHP vadovo, reikšmės iš php_admin_value ir php_admin_flag užrakintos nuo ini_set(), o Apache atveju ir nuo .htaccess.

**Ar php_admin_value galiu rašyti į .htaccess failą?**  
Ne. Pasak PHP vadovo, php_admin_value .htaccess failuose neleidžiamas. Jis priklauso Apache serverio konfigūracijai arba VirtualHost, o PHP-FPM atveju baseino failui.

**Kas atsitinka, kai programa bando pakeisti užrakintą reikšmę?**  
ini_set() iškvietimas nepavyksta ir grąžina false, užrakinta reikšmė lieka. Gerai suprogramuotos programos su tuo susitvarko. Po perėjimo vis tiek patikrinkite klaidų žurnalą ir svarbiausias funkcijas.

**Ar po pakeitimo baseine reikia paleisti iš naujo?**  
Taip. PHP-FPM baseino failus skaito paleidžiant arba iš naujo įkeliant paslaugą. Apache su mod_php tas pats galioja serverio konfigūracijai. Be paleidimo iš naujo toliau veikia sena reikšmė.

**Ar disable_functions baseine galima išplėsti?**  
Taip, su ypatumu: pasak PHP vadovo, disable_functions FPM baseine neperrašo php.ini reikšmių, o jas papildo. Taigi baseinas gali užblokuoti daugiau funkcijų, bet nė vienos negali atblokuoti.

## Šaltiniai

- [PHP vadovas: FPM konfigūracija](https://www.php.net/manual/en/install.fpm.configuration.php)
- [PHP vadovas: konfigūracijos keitimas](https://www.php.net/manual/en/configuration.changes.php)
- [PHP vadovas: nustatymų keitimo režimai](https://www.php.net/manual/en/configuration.changes.modes.php)
- [php.net: saugumo pranešimai](https://www.php.net/)
