Trenutno stanje: PHP2Shell. Dvije kritične PHP ranjivosti (CVSS 9.2) omogućuju zlonamjerni kod bez prijave. Zakrpe od 21. 10. 2026.Što sada učiniti →

php_admin_value: zaključati postavke od nadjačavanja

Sigurnosna postavka malo vrijedi ako je aplikacija jednim retkom koda ponovno promijeni. Pomoću php_admin_value i php_admin_flag vrijednosti za PHP-FPM i Apache određujete obvezujuće.

Stanje 5 min čitanjaOjačavanje i konfiguracija

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.

; /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.

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.

<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.

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.

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
// 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. Potpune prijelazne mjere nalaze se na stranici Hitne mjere ako još ne možete zakrpati.

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 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

Hitni kontakt

Svaki sat se računa. Pišite nam odmah.

Ukratko opišite sustav, verziju PHP-a i opažanje. Javit ćemo Vam se, razjasniti situaciju i raditi na daljinu dok incident nije zaključen i dokumentiran.

Hitna pomoć