Kort gezegd: php_admin_value en php_admin_flag stellen PHP-instellingen in de PHP-FPM-pool of in de Apache-configuratie zo in dat applicaties ze noch via ini_set() noch via .htaccess kunnen wijzigen. php.net eist precies dat voor de PHP2Shell-overbruggingsmaatregelen, bijvoorbeeld voor memory_limit=-1. Na het instellen moet de service herstarten en moet de waarde in de webcontext worden gecontroleerd.
Waarom „ingesteld” niet „vergrendeld” betekent
In de dagen na 21 oktober 2026 hebben veel beheerders de overbruggingsmaatregelen van php.net in hun php.ini geschreven. Een detail van het advies ging daarbij vaak verloren: memory_limit=-1 moet zo zijn ingesteld dat applicaties de waarde niet kunnen overschrijven. php.net noemt daarvoor uitdrukkelijk php_admin_value in de FPM-pool of in de Apache-configuratie.
De reden is eenvoudig. Veel CMS'en, webwinkels en frameworks stellen hun eigen waarden in, bijvoorbeeld een hoger geheugenlimiet voor imports. Staat de waarde alleen in de php.ini, dan overschrijft de applicatie haar bij de eerstvolgende aanroep. De beschermende maatregel bestaat dan op papier, maar niet in het draaiende proces.
Dat geldt niet alleen voor PHP2Shell. Elke hardening, van uitgeschakelde foutuitvoer tot uploadgrenzen, is maar zo sterk als haar zwakste niveau.
Wie PHP-instellingen eigenlijk mag wijzigen
PHP kent vier wijzigingsmodi. Elke instelling heeft er één en die bepaalt op welke plaatsen ze kan worden ingesteld. De betekenissen komen uit de PHP-handleiding.
| Modus | Waar de waarde kan worden ingesteld | Voorbeelden |
|---|---|---|
INI_USER |
in het script met ini_set() en in .user.ini |
enkele runtime-waarden |
INI_PERDIR |
php.ini, .htaccess, httpd.conf, .user.ini |
post_max_size, session.upload_progress.enabled |
INI_SYSTEM |
alleen php.ini of httpd.conf |
file_uploads, disable_functions |
INI_ALL |
overal, ook met ini_set() |
memory_limit, display_errors, open_basedir |
Gevaarlijk zijn vooral INI_ALL-waarden: ze zijn vanuit elk script te wijzigen. INI_PERDIR-waarden zijn weliswaar niet met ini_set() te wijzigen, maar wel via een .htaccess bij mod_php of een .user.ini bij PHP-FPM. Wie schrijfrechten in de webroot heeft, dus ook ingebrachte code, kan zulke bestanden aanmaken.
php_admin_value in de FPM-pool en in Apache
Bij PHP-FPM staan de waarden in het poolbestand. De PHP-handleiding stelt vast: met php_admin_value en php_admin_flag ingestelde waarden zijn niet met ini_set() te overschrijven. Voor aan/uit-waarden gebruikt u php_admin_flag, voor alle andere php_admin_value.
; /etc/php/8.3/fpm/pool.d/seite1.conf (uittreksel)
[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 hoort volgens php.net alleen samen met een geheugengrens via container of cgroup in de configuratie. Hoe dat met systemd lukt, staat in het artikel Geheugengrenzen instellen met systemd en cgroups.
Bij Apache met mod_php horen de directieven in de serverconfiguratie of de VirtualHost. Volgens de PHP-handleiding zijn ze in .htaccess niet toegestaan en kunnen na het instellen noch .htaccess noch ini_set() ze wijzigen.
<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>
Twee fijne punten uit de handleiding: om een eerder ingestelde waarde te wissen, gebruikt u none als waarde. En PHP-constanten als E_ALL hebben in de Apache-configuratie geen betekenis; voor error_reporting moet u daar de numerieke waarde opgeven.
Welke waarden u moet vergrendelen
Niet elke instelling hoeft te worden vergrendeld. Zinvol is dat voor alles wat de beveiliging raakt of als overbruggingsmaatregel dient:
- De PHP2Shell-overbruggingswaarden van php.net:
memory_limit,post_max_size,upload_max_filesize,session.upload_progress.enableden op PHP 8.5fatal_error_backtraces. - Foutuitvoer en logging:
display_errors,display_startup_errors,log_errors,error_log. - Bestandstoegang en isolatie:
open_basedir,upload_tmp_dir,session.save_path. - Netwerktoegang vanuit PHP:
allow_url_includeen, als de applicatie het niet nodig heeft,allow_url_fopen. - Geblokkeerde functies via
disable_functions, die in de pool volgens de handleiding de php.ini-lijst aanvullen en niet vervangen. Details in de gids disable_functions juist inzetten.
Bij session.upload_progress.enabled is het vergrendelen bijzonder belangrijk, omdat de waarde anders via een .user.ini weer kan worden ingeschakeld. Meer daarover onder session.upload_progress uitschakelen: juist en blijvend.
Controleren of de vergrendeling werkt
Herstart na elke wijziging de service en controleer de waarde in de webcontext. Een kort, meteen weer verwijderd controlebestand toont of de pool de waarde vasthoudt, ook als de applicatie haar wil wijzigen:
<?php
// Controlebestand: kort neerzetten, eenmaal via het domein oproepen, meteen verwijderen
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";
Verwacht wordt -1 en „blockiert”. Luidt de uitvoer „MÖGLICH”, dan is de waarde niet via php_admin_value ingesteld of is de service nog niet herstart. Herhaal de controle voor elke pool en elke PHP-versie.
Leg de vergrendelde waarden centraal vast, bijvoorbeeld in een poolsjabloon of uw configuratiebeheer. Hostingpanelen overschrijven met de hand gewijzigde poolbestanden soms bij de volgende opslag; daar horen de waarden in de door het paneel voorziene velden.
Hoe PHP zijn configuratieniveaus als geheel ordent, legt De php.ini uitgelegd: opbouw, niveaus en voorrang uit. De volledige overbruggingsmaatregelen staan onder Noodmaatregelen als u nog niet kunt patchen.
Conclusie: pas vergrendeld is echt ingesteld
De overbruggingsmaatregelen van php.net bij PHP2Shell hebben een onderscheid onder de aandacht gebracht dat voorheen vaak werd gemist: een waarde in de php.ini is voor veel instellingen slechts een voorstel, een waarde in php_admin_value een voorschrift. Voor gemakswaarden als de tijdzone is het verschil onbelangrijk. Voor beveiligingsinstellingen en overbruggingsmaatregelen bepaalt het of de maatregel in het lopende bedrijf daadwerkelijk werkt.
De inspanning is overzichtelijk: een handvol regels per pool of VirtualHost, een herstart, een korte controle. Houd de lijst met vergrendelde waarden klein en gemotiveerd, zodat ontwikkelaars kunnen begrijpen waarom hun applicatie een waarde niet mag wijzigen. En onderhoud de lijst in uw sjablonen, zodat nieuwe websites haar automatisch erven.
Hoe helpt PHP SOS concreet?
- Niveaus uitlezen: wij stellen voor elke website vast welke waarden uit php.ini, pool, Apache,
.htaccessof.user.inidaadwerkelijk gelden. - Vergrendelingen instellen: beveiligingsrelevante waarden en de PHP2Shell-overbruggingsmaatregelen nemen wij op als
php_admin_valuerespectievelijkphp_admin_flagen herstarten de services. - Applicatie testen: wij controleren of de applicatie met de vergrendelde waarden foutloos draait en analyseren het foutenlog.
- Sjablonen onderhouden: in het kader van de serverhardening nemen wij de waarden over in poolsjablonen en documentatie.
Veelgestelde vragen
Wat is het verschil tussen php_value en php_admin_value?
Beide stellen een PHP-instelling in. Waarden uit php_value kan de applicatie later weer wijzigen, bijvoorbeeld met ini_set() of .htaccess. Waarden uit php_admin_value en php_admin_flag zijn volgens de PHP-handleiding vergrendeld voor ini_set(), bij Apache ook voor .htaccess.
Kan ik php_admin_value in een .htaccess-bestand schrijven?
Nee. Volgens de PHP-handleiding is php_admin_value in .htaccess-bestanden niet toegestaan. Het hoort in de Apache-serverconfiguratie of de VirtualHost, bij PHP-FPM in het poolbestand.
Wat gebeurt er als een applicatie een vergrendelde waarde wil wijzigen?
De aanroep van ini_set() mislukt en geeft false terug, de vergrendelde waarde blijft bestaan. Goed geprogrammeerde applicaties kunnen daarmee overweg. Controleer na de omschakeling toch het foutenlog en de belangrijkste functies.
Moet ik na een wijziging in de pool herstarten?
Ja. PHP-FPM leest de poolbestanden bij het starten of bij het opnieuw laden van de service. Bij Apache met mod_php geldt hetzelfde voor de serverconfiguratie. Zonder herstart blijft de oude waarde doorlopen.
Kan disable_functions in de pool worden uitgebreid?
Ja, met een bijzonderheid: volgens de PHP-handleiding overschrijft disable_functions in de FPM-pool de waarden uit de php.ini niet, maar vult ze aan. De pool kan dus meer functies blokkeren, maar er geen vrijgeven.