Röviden: A php_admin_value és a php_admin_flag úgy állít be PHP-beállításokat a PHP-FPM-poolban vagy az Apache-konfigurációban, hogy az alkalmazások sem az ini_set()-tel, sem a .htaccess-szel ne módosíthassák őket. A php.net éppen ezt várja el a PHP2Shell-átmeneti intézkedésekhez, például a memory_limit=-1 esetében. A beállítás után a szolgáltatást újra kell indítani, és az értéket webkörnyezetben ellenőrizni kell.
Miért nem jelent a „beállítva” „zárolva” szót
A 2026. október 21. utáni napokban sok adminisztrátor beírta a php.net átmeneti intézkedéseit a php.ini-jébe. Az ajánlás egy részlete közben gyakran elveszett: a memory_limit=-1 értéket úgy kell beállítani, hogy az alkalmazások ne írhassák felül. A php.net erre kifejezetten a php_admin_value-t nevezi meg az FPM-poolban vagy az Apache-konfigurációban.
Az ok egyszerű. Sok CMS, webshop és keretrendszer a saját értékeit állítja be, például magasabb memóriakorlátot importokhoz. Ha az érték csak a php.ini-ben áll, az alkalmazás a következő hívásnál felülírja. A védőintézkedés ekkor papíron létezik, de a futó folyamatban nem.
Ez nem csak a PHP2Shellre vonatkozik. Minden keményítés, a kikapcsolt hibakimenetektől a feltöltési határokig, csak annyira erős, mint a leggyengébb szintje.
Ki módosíthatja egyáltalán a PHP-beállításokat
A PHP négy módosítási módot ismer. Minden beállításhoz tartozik egy, és ez határozza meg, mely helyeken állítható be. A jelentések a PHP kézikönyvéből származnak.
| Mód | Hol állítható be az érték | Példák |
|---|---|---|
INI_USER |
a szkriptben az ini_set()-tel és a .user.ini-ben |
néhány futásidejű érték |
INI_PERDIR |
php.ini, .htaccess, httpd.conf, .user.ini |
post_max_size, session.upload_progress.enabled |
INI_SYSTEM |
csak a php.ini vagy a httpd.conf |
file_uploads, disable_functions |
INI_ALL |
mindenhol, az ini_set()-tel is |
memory_limit, display_errors, open_basedir |
Különösen az INI_ALL értékek veszélyesek: bármelyik szkriptből módosíthatók. Az INI_PERDIR értékek ugyan nem módosíthatók az ini_set()-tel, de igen egy .htaccess-en keresztül mod_php esetén, vagy egy .user.ini-n keresztül PHP-FPM esetén. Aki írási joggal rendelkezik a webrootban, tehát a bejuttatott kód is, létrehozhat ilyen fájlokat.
php_admin_value az FPM-poolban és az Apache-ban
A PHP-FPM-nél az értékek a pool fájljában állnak. A PHP kézikönyve rögzíti: a php_admin_value-val és a php_admin_flag-gel beállított értékek nem írhatók felül az ini_set()-tel. Be/ki értékekhez használja a php_admin_flag-et, az összes többihez a php_admin_value-t.
; /etc/php/8.3/fpm/pool.d/seite1.conf (részlet)
[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/
A memory_limit=-1 a php.net szerint csak konténeren vagy cgroupon keresztüli memóriahatárral együtt való a konfigurációba. Hogyan sikerül ez a systemd-vel, azt a Memóriahatárok beállítása systemd-vel és cgroupokkal cikk írja le.
Az Apache-ban mod_php esetén a direktívák a szerverkonfigurációba vagy a VirtualHostba valók. A PHP kézikönyve szerint a .htaccess-ben nem engedélyezettek, és egyszer beállítva sem a .htaccess, sem az ini_set() nem módosíthatja őket.
<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>
Két finomság a kézikönyvből: egy korábban beállított érték törléséhez használja a none értéket. A PHP-állandóknak, mint az E_ALL, nincs jelentésük az Apache-konfigurációban; az error_reporting-hoz ott a számértéket kell megadni.
Mely értékeket érdemes zárolni
Nem minden beállítást kell zárolni. Értelmes mindazt, ami a biztonságot érinti, vagy átmeneti intézkedésként szolgál:
- A php.net PHP2Shell-átmeneti értékei:
memory_limit,post_max_size,upload_max_filesize,session.upload_progress.enabled, és PHP 8.5-ön afatal_error_backtraces. - Hibakimenet és naplózás:
display_errors,display_startup_errors,log_errors,error_log. - Fájlhozzáférés és elkülönítés:
open_basedir,upload_tmp_dir,session.save_path. - Hálózati hozzáférések a PHP-ból:
allow_url_include, és ha az alkalmazásnak nincs rá szüksége,allow_url_fopen. - A
disable_functionsútján letiltott függvények, amelyek a poolban a kézikönyv szerint kiegészítik a php.ini listáját, nem helyettesítik. Részletek a A disable_functions helyes használata útmutatóban.
A session.upload_progress.enabled esetében a zárolás különösen fontos, mert az érték különben egy .user.ini-n keresztül újra bekapcsolható lenne. Bővebben a session.upload_progress kikapcsolása: helyesen és tartósan cikkben.
Ellenőrzés, hogy a zárolás hat-e
Minden módosítás után indítsa újra a szolgáltatást, és ellenőrizze az értéket webkörnyezetben. Egy rövid, azonnal ismét törölt ellenőrző fájl megmutatja, hogy a pool megtartja-e az értéket akkor is, ha az alkalmazás módosítani akarja:
<?php
// Ellenőrző fájl: rövid időre elhelyezni, egyszer meghívni a domainen keresztül, azonnal törölni
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";
Elvárt a -1 és a „blockiert”. Ha a kimenet „MÖGLICH”, az érték nincs a php_admin_value-n keresztül beállítva, vagy a szolgáltatást még nem indították újra. Ismételje meg az ellenőrzést minden poolra és minden PHP-verzióra.
A zárolt értékeket tartsa nyilván központilag, például egy pool-sablonban vagy a konfigurációkezelésében. A tárhelypanelek részben felülírják a kézzel módosított pool-fájlokat a következő mentéskor; ott az értékek a panel által előirányzott mezőkbe valók.
Hogyan rendezi a PHP összességében a konfigurációs szintjeit, azt A php.ini magyarázata: felépítés, szintek és elsőbbség írja le. A teljes átmeneti intézkedések az Azonnali intézkedések, ha még nem tud javítani oldalon találhatók.
Összegzés: csak a zárolt érték van valóban beállítva
A php.net PHP2Shellre vonatkozó átmeneti intézkedései tudatosítottak egy megkülönböztetést, amelyet korábban gyakran átnéztek: sok beállításnál a php.ini-ben lévő érték csak javaslat, a php_admin_value-ban lévő érték viszont előírás. Az olyan kényelmi értékeknél, mint az időzóna, a különbség lényegtelen. A biztonsági beállításoknál és az átmeneti intézkedéseknél azon múlik, hogy az intézkedés egyáltalán hat-e az éles üzemben.
A ráfordítás áttekinthető: egy maroknyi sor poolonként vagy VirtualHostonként, egy újraindítás, egy rövid ellenőrzés. Tartsa kicsinek és megindokoltnak a zárolt értékek listáját, hogy a fejlesztők megérthessék, miért nem módosíthat az alkalmazásuk egy értéket. És gondozza a listát a sablonjaiban, hogy az új weboldalak automatikusan örököljék.
Hogyan segít konkrétan a PHP SOS?
- A szintek kiolvasása: Minden weboldalra megállapítjuk, mely értékek érvényesek ténylegesen a php.ini-ből, a poolból, az Apache-ból, a
.htaccess-ből vagy a.user.ini-ből. - Zárolások beállítása: A biztonsági szempontból lényeges értékeket és a PHP2Shell-átmeneti intézkedéseket
php_admin_valueilletvephp_admin_flagformájában beírjuk, és a szolgáltatásokat újraindítjuk. - Az alkalmazás tesztelése: Ellenőrizzük, hogy az alkalmazás hibátlanul fut-e a zárolt értékekkel, és kiértékeljük a hibanaplót.
- A sablonok gondozása: A szerverkeményítés keretében átvesszük az értékeket a pool-sablonokba és a dokumentációba.
Gyakori kérdések
Mi a különbség a php_value és a php_admin_value között?
Mindkettő egy PHP-beállítást állít be. A php_value értékeit az alkalmazás később újra megváltoztathatja, például az ini_set()-tel vagy a .htaccess-szel. A php_admin_value és a php_admin_flag értékei a PHP kézikönyve szerint zároltak az ini_set() számára, az Apache-nál a .htaccess számára is.
Írhatom a php_admin_value-t egy .htaccess fájlba?
Nem. A PHP kézikönyve szerint a php_admin_value nem engedélyezett a .htaccess fájlokban. Az Apache szerverkonfigurációjába vagy a VirtualHostba való, PHP-FPM esetén a pool fájljába.
Mi történik, ha egy alkalmazás egy zárolt értéket akar módosítani?
Az ini_set() hívása meghiúsul és false értéket ad vissza, a zárolt érték megmarad. A jól programozott alkalmazások ezzel boldogulnak. Az átállás után mégis ellenőrizze a hibanaplót és a legfontosabb funkciókat.
Újra kell indítani egy módosítás után a poolt?
Igen. A PHP-FPM a pool fájljait induláskor vagy a szolgáltatás újratöltésekor olvassa be. Az Apache mod_php-val ugyanez érvényes a szerverkonfigurációra. Újraindítás nélkül a régi érték fut tovább.
Bővíthető a disable_functions a poolban?
Igen, egy különlegességgel: a PHP kézikönyve szerint a disable_functions az FPM-poolban nem írja felül a php.ini értékeit, hanem kiegészíti őket. A pool tehát további függvényeket tilthat le, de egyet sem oldhat fel.