# php_admin_value: zaključati postavke od nadjačavanja

> php_admin_value i php_admin_flag objašnjeni: kako PHP vrijednosti u FPM poolu i Apacheu zaključati od ini_set(), .htaccess i .user.ini te kako to provjeriti.

Izvor: https://phpsos.de/hr/blog/php-admin-value-sperren/  
Stanje: 25.10.2026  
Pružatelj: PHP SOS, PHP hitna pomoć i sigurnost poslužitelja. Hitna pomoć putem WhatsAppa: https://wa.me/491736494914?text=Pozdrav%20PHP%20SOS%2C%20trebamo%20pomo%C4%87%20s%20na%C5%A1im%20PHP%20poslu%C5%BEiteljem.%20Tvrtka%3A%20%E2%80%A6%20Web-stranica%3A%20%E2%80%A6

**Ukratko:** `php_admin_value` i `php_admin_flag` postavljaju PHP postavke u PHP-FPM poolu ili u Apache konfiguraciji tako da ih aplikacije ne mogu promijeniti ni putem `ini_set()` ni putem `.htaccess`. php.net upravo to traži za prijelazne mjere za PHP2Shell, primjerice za `memory_limit=-1`. Nakon postavljanja usluga se mora ponovno pokrenuti, a vrijednost provjeriti u web-kontekstu.

## Zašto „postavljeno“ ne znači „zaključano“

U danima nakon 21. listopada 2026. mnogi su administratori prijelazne mjere php.net-a upisali u svoju php.ini. Jedna pojedinost preporuke pritom je često promakla: `memory_limit=-1` treba postaviti tako da ga aplikacije ne mogu nadjačati. php.net za to izričito navodi `php_admin_value` u FPM poolu ili u Apache konfiguraciji.

Razlog je jednostavan. Mnogi CMS-ovi, shopovi i frameworki postavljaju vlastite vrijednosti, primjerice višu granicu memorije za uvoze. Ako vrijednost stoji samo u php.ini, aplikacija je pri sljedećem pozivu nadjačava. Zaštitna mjera tada postoji na papiru, ali ne u pokrenutom procesu.

To se ne tiče samo PHP2Shella. Svako ojačavanje, od isključenih ispisa pogrešaka do granica prijenosa, jednako je jako kao njegova najslabija razina.

## Tko uopće smije mijenjati PHP postavke

PHP poznaje četiri načina izmjene. Svaka postavka ima jedan od njih i on određuje na kojim se mjestima može postaviti. Značenja potječu iz PHP priručnika.

| Način | Gdje se vrijednost može postaviti | Primjeri |
|---|---|---|
| `INI_USER` | u skripti putem `ini_set()` i u `.user.ini` | nekoliko vrijednosti tijekom rada |
| `INI_PERDIR` | php.ini, `.htaccess`, `httpd.conf`, `.user.ini` | `post_max_size`, `session.upload_progress.enabled` |
| `INI_SYSTEM` | samo php.ini ili `httpd.conf` | `file_uploads`, `disable_functions` |
| `INI_ALL` | posvuda, i putem `ini_set()` | `memory_limit`, `display_errors`, `open_basedir` |

Opasne su ponajprije `INI_ALL` vrijednosti: mogu se promijeniti iz svake skripte. `INI_PERDIR` vrijednosti doduše se ne mogu promijeniti putem `ini_set()`, ali mogu putem `.htaccess` kod mod_php-a ili `.user.ini` kod PHP-FPM-a. Tko ima prava pisanja u web-korijenu, dakle i ubačeni kod, može izraditi takve datoteke.

## php_admin_value u FPM poolu i u Apacheu

Kod PHP-FPM-a vrijednosti stoje u datoteci poola. PHP priručnik navodi: vrijednosti postavljene pomoću `php_admin_value` i `php_admin_flag` ne mogu se nadjačati putem `ini_set()`. Za vrijednosti uključeno-isključeno koristite `php_admin_flag`, za sve ostale `php_admin_value`.

```ini
; /etc/php/8.3/fpm/pool.d/seite1.conf (izvadak)
[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` prema php.net-u pripada u konfiguraciju samo zajedno s granicom memorije putem kontejnera ili cgroupa. Kako to uspijeva sa systemd-om, piše u članku [Postaviti granice memorije pomoću systemd-a i cgroupa](https://phpsos.de/hr/blog/speichergrenzen-systemd-cgroups/).

Kod Apachea s mod_php-om direktive pripadaju u konfiguraciju poslužitelja ili VirtualHost. Prema PHP priručniku nisu dopuštene u `.htaccess`, a kad su jednom postavljene, ni `.htaccess` ni `ini_set()` ne mogu ih promijeniti.

```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>
```

Dvije sitnice iz priručnika: da biste izbrisali prethodno postavljenu vrijednost, kao vrijednost koristite `none`. A PHP konstante poput `E_ALL` u Apache konfiguraciji nemaju značenje; za `error_reporting` tamo morate navesti brojčanu vrijednost.

## Koje vrijednosti zaključati

Ne mora biti zaključana svaka postavka. Smisleno je to za sve što se tiče sigurnosti ili služi kao prijelazna mjera:

1. Prijelazne vrijednosti php.net-a za PHP2Shell: `memory_limit`, `post_max_size`, `upload_max_filesize`, `session.upload_progress.enabled` i na PHP-u 8.5 `fatal_error_backtraces`.
2. Ispis pogrešaka i zapisivanje: `display_errors`, `display_startup_errors`, `log_errors`, `error_log`.
3. Pristup datotekama i izolacija: `open_basedir`, `upload_tmp_dir`, `session.save_path`.
4. Mrežni pristupi iz PHP-a: `allow_url_include` i, ako ga aplikacija ne treba, `allow_url_fopen`.
5. Blokirane funkcije putem `disable_functions`, koje u poolu prema priručniku dopunjuju popis iz php.ini, a ne zamjenjuju ga. Pojedinosti u vodiču [Pravilno koristiti disable_functions](https://phpsos.de/hr/ratgeber/disable-functions/).

Kod `session.upload_progress.enabled` zaključavanje je osobito važno jer bi se vrijednost inače mogla ponovno uključiti putem `.user.ini`. Više o tome u članku [Isključiti session.upload_progress: ispravno i trajno](https://phpsos.de/hr/blog/session-upload-progress-abschalten/).

## Provjeriti djeluje li zaključavanje

Nakon svake izmjene ponovno pokrenite uslugu i provjerite vrijednost u web-kontekstu. Kratka datoteka za provjeru, odmah zatim izbrisana, pokazuje drži li pool vrijednost čak i kad je aplikacija želi promijeniti:

```php
<?php
// Datoteka za provjeru: odložiti nakratko, jednom pozvati preko domene, odmah izbrisati
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čekuje se `-1` i „blockiert“. Ako ispis glasi „MÖGLICH“, vrijednost nije postavljena putem `php_admin_value` ili usluga još nije ponovno pokrenuta. Provjeru ponovite za svaki pool i svaku verziju PHP-a.

> **Savjet:**
> Zaključane vrijednosti zabilježite središnje, primjerice u predlošku poola ili u svom upravljanju konfiguracijom. Hosting paneli djelomično prepisuju ručno izmijenjene datoteke poolova pri sljedećem spremanju; tamo vrijednosti pripadaju u polja koja panel predviđa.

Kako PHP u cjelini uređuje svoje razine konfiguracije, objašnjava članak [php.ini objašnjen: struktura, razine i prednost](https://phpsos.de/hr/php/php-ini-erklaert/). Potpune prijelazne mjere nalaze se na stranici [Hitne mjere ako još ne možete zakrpati](https://phpsos.de/hr/php2shell/sofortmassnahmen-ohne-patch/).

## Zaključak: tek zaključano doista je postavljeno

Prijelazne mjere php.net-a za PHP2Shell uvele su u svijest razliku koja se prije često previđala: vrijednost u php.ini za mnoge je postavke tek prijedlog, a vrijednost u `php_admin_value` zadatak. Za udobne vrijednosti poput vremenske zone razlika je nevažna. Za sigurnosne postavke i prijelazne mjere ona odlučuje djeluje li mjera uopće u pokrenutom radu.

Trud je podnošljiv: šačica redaka po poolu ili VirtualHostu, jedno ponovno pokretanje, kratka provjera. Popis zaključanih vrijednosti držite malim i obrazloženim kako bi programeri mogli razumjeti zašto njihova aplikacija ne smije promijeniti neku vrijednost. I održavajte popis u svojim predlošcima kako bi ga nove web-stranice automatski naslijedile.

## Kako PHP SOS konkretno pomaže?

- **Očitati razine:** za svaku web-stranicu utvrđujemo koje vrijednosti iz php.ini, poola, Apachea, `.htaccess` ili `.user.ini` stvarno vrijede.
- **Postaviti zaključavanja:** sigurnosno relevantne vrijednosti i prijelazne mjere za PHP2Shell upisujemo kao `php_admin_value` odnosno `php_admin_flag` i ponovno pokrećemo usluge.
- **Testirati aplikaciju:** provjeravamo radi li aplikacija bez pogrešaka sa zaključanim vrijednostima i analiziramo zapisnik pogrešaka.
- **Održavati predloške:** u sklopu [ojačavanja poslužitelja](https://phpsos.de/hr/leistungen/server-haertung/) vrijednosti preuzimamo u predloške poolova i dokumentaciju.


## Česta pitanja

**Koja je razlika između php_value i php_admin_value?**  
Oba postavljaju PHP postavku. Vrijednosti iz php_value aplikacija kasnije može ponovno promijeniti, primjerice putem ini_set() ili .htaccess. Vrijednosti iz php_admin_value i php_admin_flag prema PHP priručniku zaključane su za ini_set(), a kod Apachea i za .htaccess.

**Mogu li php_admin_value upisati u datoteku .htaccess?**  
Ne. Prema PHP priručniku php_admin_value nije dopušten u datotekama .htaccess. Pripada u Apache konfiguraciju poslužitelja ili VirtualHost, a kod PHP-FPM-a u datoteku poola.

**Što se događa ako aplikacija pokuša promijeniti zaključanu vrijednost?**  
Poziv ini_set() ne uspijeva i vraća false, a zaključana vrijednost ostaje. Dobro programirane aplikacije s time se nose. Ipak nakon prelaska provjerite zapisnik pogrešaka i najvažnije funkcije.

**Moram li nakon izmjene u poolu ponovno pokrenuti?**  
Moram. PHP-FPM datoteke poolova čita pri pokretanju ili ponovnom učitavanju usluge. Kod Apachea s mod_php isto vrijedi za konfiguraciju poslužitelja. Bez ponovnog pokretanja stara vrijednost nastavlja vrijediti.

**Može li se disable_functions u poolu proširiti?**  
Može, uz jednu posebnost: prema PHP priručniku disable_functions u FPM poolu ne nadjačava vrijednosti iz php.ini, nego ih dopunjuje. Pool dakle može blokirati dodatne funkcije, ali nijednu ne može osloboditi.

## Izvori

- [PHP priručnik: FPM konfiguracija](https://www.php.net/manual/en/install.fpm.configuration.php)
- [PHP priručnik: mijenjanje konfiguracije](https://www.php.net/manual/en/configuration.changes.php)
- [PHP priručnik: načini izmjene postavki](https://www.php.net/manual/en/configuration.changes.modes.php)
- [php.net: sigurnosne obavijesti](https://www.php.net/)
