# php_admin_value: iestatījumu bloķēšana pret pārrakstīšanu

> php_admin_value un php_admin_flag skaidrojums: kā PHP vērtības FPM pūlā un Apache nobloķēt pret ini_set(), .htaccess un .user.ini un to pārbaudīt.

Avots: https://phpsos.de/lv/blog/php-admin-value-sperren/  
Aktuāls uz: 25.10.2026  
Pakalpojuma sniedzējs: PHP SOS, PHP ārkārtas palīdzība un serveru drošība. Tūlītēja palīdzība pa WhatsApp: https://wa.me/491736494914?text=Sveiki%2C%20PHP%20SOS%2C%20mums%20nepiecie%C5%A1ama%20pal%C4%ABdz%C4%ABba%20ar%20m%C5%ABsu%20PHP%20serveri.%20Uz%C5%86%C4%93mums%3A%20%E2%80%A6%20Vietne%3A%20%E2%80%A6

**Īsi sakot:** `php_admin_value` un `php_admin_flag` iestata PHP iestatījumus PHP-FPM pūlā vai Apache konfigurācijā tā, ka lietojumprogrammas tos nevar mainīt ne ar `ini_set()`, ne ar `.htaccess`. Tieši to php.net prasa PHP2Shell pārejas pasākumiem, piemēram, `memory_limit=-1`. Pēc iestatīšanas pakalpojums jāpārstartē, un vērtība jāpārbauda tīmekļa kontekstā.

## Kāpēc „iestatīts" nenozīmē „nobloķēts"

Dienās pēc 2026. gada 21. oktobra daudzi administratori ierakstīja php.net pārejas pasākumus savā php.ini. Viena ieteikuma detaļa bieži palika nepamanīta: `memory_limit=-1` jāiestata tā, lai lietojumprogrammas to nevarētu pārrakstīt. php.net šim nolūkam nepārprotami min `php_admin_value` FPM pūlā vai Apache konfigurācijā.

Iemesls ir vienkāršs. Daudzi CMS, veikali un ietvari iestata savas vērtības, piemēram, augstāku atmiņas robežu importiem. Ja vērtība ir tikai failā php.ini, lietojumprogramma to pārraksta nākamajā izsaukumā. Aizsardzības pasākums tad pastāv uz papīra, bet ne darbojošā procesā.

Tas attiecas ne tikai uz PHP2Shell. Katra nostiprināšana, sākot no izslēgtas kļūdu izvades līdz augšupielādes robežām, ir tikai tik stipra, cik tās vājākais līmenis.

## Kam vispār drīkst mainīt PHP iestatījumus

PHP pazīst četrus maiņas režīmus. Katram iestatījumam ir viens no tiem, un tas nosaka, kurās vietās to var iestatīt. Nozīmes ņemtas no PHP rokasgrāmatas.

| Režīms | Kur vērtību var iestatīt | Piemēri |
|---|---|---|
| `INI_USER` | skriptā ar `ini_set()` un `.user.ini` | daži izpildes laika iestatījumi |
| `INI_PERDIR` | php.ini, `.htaccess`, `httpd.conf`, `.user.ini` | `post_max_size`, `session.upload_progress.enabled` |
| `INI_SYSTEM` | tikai php.ini vai `httpd.conf` | `file_uploads`, `disable_functions` |
| `INI_ALL` | visur, arī ar `ini_set()` | `memory_limit`, `display_errors`, `open_basedir` |

Bīstamas ir galvenokārt `INI_ALL` vērtības: tās var mainīt no jebkura skripta. `INI_PERDIR` vērtības gan nevar mainīt ar `ini_set()`, taču var ar `.htaccess` mod_php gadījumā vai `.user.ini` PHP-FPM gadījumā. Kam tīmekļa saknē ir rakstīšanas tiesības, tātad arī ielikts kods, tas šādus failus var izveidot.

## php_admin_value FPM pūlā un Apache

PHP-FPM gadījumā vērtības atrodas pūla failā. PHP rokasgrāmata nosaka: ar `php_admin_value` un `php_admin_flag` iestatītās vērtības nevar pārrakstīt ar `ini_set()`. Ieslēgts/izslēgts vērtībām izmantojiet `php_admin_flag`, visām pārējām `php_admin_value`.

```ini
; /etc/php/8.3/fpm/pool.d/seite1.conf (izvilkums)
[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` saskaņā ar php.net konfigurācijā pieder tikai kopā ar atmiņas robežu caur konteineru vai cgroup. Kā tas izdodas ar systemd, rakstīts sadaļā [Atmiņas robežu iestatīšana ar systemd un cgroups](https://phpsos.de/lv/blog/speichergrenzen-systemd-cgroups/).

Apache ar mod_php direktīvas pieder servera konfigurācijā vai VirtualHost. Saskaņā ar PHP rokasgrāmatu tās `.htaccess` nav atļautas, un reiz iestatītas tās nevar mainīt ne `.htaccess`, ne `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>
```

Divas smalkumi no rokasgrāmatas: lai izdzēstu iepriekš iestatītu vērtību, kā vērtību izmantojiet `none`. Un PHP konstantēm, piemēram, `E_ALL`, Apache konfigurācijā nav nozīmes; `error_reporting` tur jānorāda skaitliskā vērtība.

## Kuras vērtības bloķēt

Ne katram iestatījumam jābūt nobloķētam. Tas ir saprātīgi visam, kas skar drošību vai kalpo kā pārejas pasākums:

1. php.net PHP2Shell pārejas vērtības: `memory_limit`, `post_max_size`, `upload_max_filesize`, `session.upload_progress.enabled` un PHP 8.5 `fatal_error_backtraces`.
2. Kļūdu izvade un protokolēšana: `display_errors`, `display_startup_errors`, `log_errors`, `error_log`.
3. Piekļuve failiem un izolācija: `open_basedir`, `upload_tmp_dir`, `session.save_path`.
4. Tīkla piekļuves no PHP: `allow_url_include` un, ja lietojumprogramma to nevajag, `allow_url_fopen`.
5. Nobloķētas funkcijas caur `disable_functions`, kas pūlā saskaņā ar rokasgrāmatu php.ini sarakstu papildina, nevis aizstāj. Detaļas ceļvedī [disable_functions pareiza lietošana](https://phpsos.de/lv/ratgeber/disable-functions/).

`session.upload_progress.enabled` bloķēšana ir īpaši svarīga, jo vērtību citādi varētu atkal ieslēgt ar `.user.ini`. Vairāk sadaļā [session.upload_progress izslēgšana: pareizi un pastāvīgi](https://phpsos.de/lv/blog/session-upload-progress-abschalten/).

## Pārbaude, vai bloķēšana darbojas

Pēc katras izmaiņas pakalpojumu pārstartējiet un pārbaudiet vērtību tīmekļa kontekstā. Īss, nekavējoties atkal izdzēsts pārbaudes fails parāda, vai pūls vērtību notur, arī ja lietojumprogramma to grib mainīt:

```php
<?php
// Pārbaudes fails: īsi novietot, vienreiz izsaukt caur domēnu, nekavējoties izdzēst
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";
```

Sagaidāma ir `-1` un „blockiert". Ja izvade ir „MÖGLICH", vērtība nav iestatīta ar `php_admin_value` vai pakalpojums vēl nav pārstartēts. Pārbaudi atkārtojiet katram pūlam un katrai PHP versijai.

> **Padoms:**
> Nobloķētās vērtības fiksējiet centralizēti, piemēram, pūla veidnē vai konfigurācijas pārvaldībā. Hostinga paneļi ar roku mainītos pūlu failus dažkārt pārraksta nākamajā saglabāšanā; tur vērtībām jābūt paneļa paredzētajos laukos.

Kā PHP kopumā kārto savus konfigurācijas līmeņus, izskaidro [php.ini skaidrojums: uzbūve, līmeņi un prioritāte](https://phpsos.de/lv/php/php-ini-erklaert/). Pilnie pārejas pasākumi atrodami sadaļā [Tūlītēji pasākumi, ja vēl nevarat ielāpot](https://phpsos.de/lv/php2shell/sofortmassnahmen-ohne-patch/).

## Secinājums: tikai nobloķēts ir patiešām iestatīts

php.net pārejas pasākumi pret PHP2Shell ir pievērsuši uzmanību atšķirībai, kas iepriekš bieži tika palaista garām: vērtība failā php.ini daudziem iestatījumiem ir tikai ieteikums, vērtība `php_admin_value` ir noteikums. Komforta vērtībām, piemēram, laika joslai, atšķirībai nav nozīmes. Drošības iestatījumiem un pārejas pasākumiem tā izšķir, vai pasākums ikdienas darbībā vispār darbojas.

Piepūle ir pārskatāma: dažas rindiņas katram pūlam vai VirtualHost, pārstartēšana, īsa pārbaude. Nobloķēto vērtību sarakstu turiet mazu un pamatotu, lai izstrādātāji varētu saprast, kāpēc viņu lietojumprogramma kādu vērtību nedrīkst mainīt. Un uzturiet sarakstu savās veidnēs, lai jaunas vietnes to mantotu automātiski.

## Kā PHP SOS palīdz konkrēti?

- **Nolasīt līmeņus:** mēs katrai vietnei noskaidrojam, kuras vērtības no php.ini, pūla, Apache, `.htaccess` vai `.user.ini` faktiski darbojas.
- **Iestatīt bloķēšanu:** drošībai būtiskās vērtības un PHP2Shell pārejas pasākumus mēs ierakstām kā `php_admin_value` resp. `php_admin_flag` un pārstartējam pakalpojumus.
- **Testēt lietojumprogrammu:** mēs pārbaudām, vai lietojumprogramma ar nobloķētām vērtībām darbojas bez kļūdām, un izvērtējam kļūdu žurnālu.
- **Uzturēt veidnes:** [serveru nostiprināšanas](https://phpsos.de/lv/leistungen/server-haertung/) ietvaros mēs vērtības pārņemam pūlu veidnēs un dokumentācijā.


## Biežāk uzdotie jautājumi

**Kāda ir atšķirība starp php_value un php_admin_value?**  
Abi iestata PHP iestatījumu. Vērtības no php_value lietojumprogramma vēlāk var atkal mainīt, piemēram, ar ini_set() vai .htaccess. Vērtības no php_admin_value un php_admin_flag saskaņā ar PHP rokasgrāmatu ir nobloķētas pret ini_set(), Apache gadījumā arī pret .htaccess.

**Vai php_admin_value varu ierakstīt .htaccess failā?**  
Nē. Saskaņā ar PHP rokasgrāmatu php_admin_value .htaccess failos nav atļauts. Tas pieder Apache servera konfigurācijā vai VirtualHost, PHP-FPM gadījumā pūla failā.

**Kas notiek, ja lietojumprogramma grib mainīt nobloķētu vērtību?**  
ini_set() izsaukums neizdodas un atgriež false, nobloķētā vērtība paliek spēkā. Labi programmētas lietojumprogrammas ar to tiek galā. Tomēr pēc pārejas pārbaudiet kļūdu žurnālu un svarīgākās funkcijas.

**Vai pēc izmaiņas pūlā jāpārstartē?**  
Jā. PHP-FPM pūlu failus nolasa startējot vai pakalpojumu pārlādējot. Apache ar mod_php tas pats attiecas uz servera konfigurāciju. Bez pārstartēšanas vecā vērtība turpina darboties.

**Vai disable_functions pūlā var paplašināt?**  
Jā, ar īpatnību: saskaņā ar PHP rokasgrāmatu disable_functions FPM pūlā php.ini vērtības nepārraksta, bet papildina. Pūls tātad var nobloķēt vēl citas funkcijas, bet nevienu neatbrīvot.

## Avoti

- [PHP rokasgrāmata: FPM konfigurācija](https://www.php.net/manual/en/install.fpm.configuration.php)
- [PHP rokasgrāmata: konfigurācijas maiņa](https://www.php.net/manual/en/configuration.changes.php)
- [PHP rokasgrāmata: iestatījumu maiņas režīmi](https://www.php.net/manual/en/configuration.changes.modes.php)
- [php.net: drošības paziņojumi](https://www.php.net/)
