Ī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.
; /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.
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().
<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:
- php.net PHP2Shell pārejas vērtības:
memory_limit,post_max_size,upload_max_filesize,session.upload_progress.enabledun PHP 8.5fatal_error_backtraces. - Kļūdu izvade un protokolēšana:
display_errors,display_startup_errors,log_errors,error_log. - Piekļuve failiem un izolācija:
open_basedir,upload_tmp_dir,session.save_path. - Tīkla piekļuves no PHP:
allow_url_includeun, ja lietojumprogramma to nevajag,allow_url_fopen. - 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.
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.
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
// 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.
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. Pilnie pārejas pasākumi atrodami sadaļā Tūlītēji pasākumi, ja vēl nevarat ielāpot.
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,
.htaccessvai.user.inifaktiski 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_valueresp.php_admin_flagun 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 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.