Praegune olukord: PHP2Shell. Kaks kriitilist PHP turvaauku (CVSS 9,2) lubavad kahjulikku koodi ilma sisselogimata. Paigad alates 21.10.2026.Mida nüüd teha →

php_admin_value: sätete kaitsmine ülekirjutamise eest

Turvasäte on vähe väärt, kui rakendus muudab selle ühe koodireaga tagasi. Käskudega php_admin_value ja php_admin_flag määrate väärtused PHP-FPM-ile ja Apache'ile siduvalt.

Seis Lugemisaeg 5 minKarastamine ja seadistus

Lühidalt: php_admin_value ja php_admin_flag seavad PHP sätted PHP-FPM-poolis või Apache'i konfiguratsioonis nii, et rakendused ei saa neid muuta ei käsuga ini_set() ega faili .htaccess kaudu. Just seda nõuab php.net PHP2Shelli üleminekumeetmete jaoks, näiteks memory_limit=-1 puhul. Pärast seadmist peab teenus taaskäivituma ja väärtust tuleks kontrollida veebikontekstis.

Miks „seatud“ ei tähenda „lukustatud“

  1. oktoobrile 2026 järgnenud päevil kirjutasid paljud administraatorid php.net'i üleminekumeetmed oma faili php.ini. Soovituse üks üksikasi jäi seejuures sageli märkamata: memory_limit=-1 peab olema seatud nii, et rakendused ei saa seda üle kirjutada. php.net nimetab selleks otsesõnu php_admin_value FPM-poolis või Apache'i konfiguratsioonis.

Põhjus on lihtne. Paljud CMS-id, poed ja raamistikud seavad oma väärtused, näiteks kõrgema mälupiiri importide jaoks. Kui väärtus on ainult failis php.ini, kirjutab rakendus selle järgmisel päringul üle. Kaitsemeede eksisteerib siis paberil, kuid mitte töötavas protsessis.

See ei puuduta ainult PHP2Shelli. Iga karastamine, väljalülitatud veaväljundist üleslaadimispiirideni, on nii tugev kui selle nõrgim tasand.

Kes PHP sätteid üldse muuta tohib

PHP-l on neli muutmisrežiimi. Igal sättel on neist üks ja see määrab, millistes kohtades seda saab seada. Tähendused pärinevad PHP käsiraamatust.

Režiim Kus väärtust saab seada Näited
INI_USER skriptis käsuga ini_set() ja failis .user.ini mõned käitusaja väärtused
INI_PERDIR php.ini, .htaccess, httpd.conf, .user.ini post_max_size, session.upload_progress.enabled
INI_SYSTEM ainult php.ini või httpd.conf file_uploads, disable_functions
INI_ALL kõikjal, ka käsuga ini_set() memory_limit, display_errors, open_basedir

Ohtlikud on eelkõige INI_ALL-väärtused: neid saab muuta igast skriptist. INI_PERDIR-väärtusi ei saa küll käsuga ini_set() muuta, küll aga mod_php puhul .htaccess või PHP-FPM-i puhul .user.ini kaudu. Kellel on kirjutusõigused veebijuurkataloogis, seega ka sissetoodud koodil, saab selliseid faile luua.

php_admin_value FPM-poolis ja Apache'is

PHP-FPM-i puhul asuvad väärtused pooli failis. PHP käsiraamat märgib: käskudega php_admin_value ja php_admin_flag seatud väärtusi ei saa käsuga ini_set() üle kirjutada. Sisse-välja-väärtuste jaoks kasutage php_admin_flag, kõigi teiste jaoks php_admin_value.

; /etc/php/8.3/fpm/pool.d/seite1.conf (väljavõte)
[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 kuulub php.net'i järgi konfiguratsiooni ainult koos mälupiiriga konteineri või cgroup'i kaudu. Kuidas see systemd-ga õnnestub, on kirjas artiklis Mälupiiride seadmine systemd ja cgroup'idega.

Apache'is mod_php-ga kuuluvad direktiivid serverikonfiguratsiooni või VirtualHosti. PHP käsiraamatu järgi ei ole need failis .htaccess lubatud ja kord seatuna ei saa neid muuta ei .htaccess ega 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>

Kaks käsiraamatu peensust: varem seatud väärtuse kustutamiseks kasutage väärtusena none. Ja PHP konstandid nagu E_ALL ei oma Apache'i konfiguratsioonis tähendust; error_reporting jaoks tuleb seal anda arvväärtus.

Milliseid väärtusi peaksite lukustama

Mitte iga säte ei pea olema lukustatud. Mõistlik on see kõige jaoks, mis puudutab turvalisust või mis on üleminekumeede:

  1. php.net'i PHP2Shelli üleminekuväärtused: memory_limit, post_max_size, upload_max_filesize, session.upload_progress.enabled ja PHP 8.5-s fatal_error_backtraces.
  2. Veaväljund ja protokollimine: display_errors, display_startup_errors, log_errors, error_log.
  3. Faililigipääs ja eraldatus: open_basedir, upload_tmp_dir, session.save_path.
  4. Võrgujuurdepääsud PHP-st: allow_url_include ja, kui rakendus seda ei vaja, allow_url_fopen.
  5. Käsuga disable_functions blokeeritud funktsioonid, mis täiendavad poolis käsiraamatu järgi php.ini loendit, mitte ei asenda seda. Üksikasjad juhendis disable_functions õige kasutamine.

session.upload_progress.enabled puhul on lukustamine eriti oluline, sest muidu võiks väärtuse .user.ini kaudu uuesti sisse lülitada. Rohkem artiklis session.upload_progress väljalülitamine: õigesti ja püsivalt.

Kontrollimine, kas lukk toimib

Käivitage teenus pärast iga muudatust uuesti ja kontrollige väärtust veebikontekstis. Lühike, kohe jälle kustutatud kontrollfail näitab, kas pool hoiab väärtust ka siis, kui rakendus tahab seda muuta:

<?php
// Kontrollfail: pange korraks, avage üks kord domeeni kaudu, kustutage kohe
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";

Oodatav on -1 ja „blockiert“. Kui väljund on „MÖGLICH“, ei ole väärtus seatud käsuga php_admin_value või teenust pole veel taaskäivitatud. Korrake kontrolli iga pooli ja iga PHP versiooni jaoks.

Näpunäide

Hoidke lukustatud väärtusi keskselt, näiteks pooli mallis või konfiguratsioonihalduses. Majutuspaneelid kirjutavad käsitsi muudetud pooli failid osaliselt järgmisel salvestamisel üle; seal kuuluvad väärtused paneeli ettenähtud väljadele.

Kuidas PHP oma konfiguratsioonitasandeid tervikuna korraldab, selgitab php.ini selgitus: ülesehitus, tasandid ja eesõigus. Täielikud üleminekumeetmed on lehel Kiirmeetmed, kui te ei saa veel paikama hakata.

Kokkuvõte: alles lukustatult on seatud tõeliselt

php.net'i PHP2Shelli üleminekumeetmed on teadvustanud vahet, mida varem sageli märgati: väärtus failis php.ini on paljude sätete puhul vaid ettepanek, väärtus käsuga php_admin_value on ettekirjutus. Mugavusväärtuste, nagu ajavöönd, puhul pole vahe oluline. Turvasätete ja üleminekumeetmete puhul otsustab see, kas meede töötavas süsteemis üldse mõjub.

Vaev on ülevaadatav: peotäis ridu pooli või VirtualHosti kohta, üks taaskäivitus, üks lühike kontroll. Hoidke lukustatud väärtuste loend väike ja põhjendatud, et arendajad saaksid aru, miks nende rakendus väärtust muuta ei tohi. Ja hooldage loendit oma mallides, et uued veebisaidid selle automaatselt pärivad.

Kuidas PHP SOS konkreetselt aitab?

  • Tasandid välja lugeda: selgitame iga veebisaidi kohta, millised väärtused failidest php.ini, pool, Apache, .htaccess või .user.ini tegelikult kehtivad.
  • Lukud seada: turvaolulised väärtused ja PHP2Shelli üleminekumeetmed kanname sisse käskudena php_admin_value või php_admin_flag ning taaskäivitame teenused.
  • Rakendust testida: kontrollime, kas rakendus töötab lukustatud väärtustega veatult, ja analüüsime vealogi.
  • Malle hooldada: serveri karastamise raames võtame väärtused üle pooli mallidesse ja dokumentatsiooni.

Korduma kippuvad küsimused

Mis vahe on php_value'l ja php_admin_value'l?

Mõlemad seavad PHP sätte. php_value väärtusi saab rakendus hiljem uuesti muuta, näiteks käsuga ini_set() või failis .htaccess. php_admin_value ja php_admin_flag väärtused on PHP käsiraamatu järgi ini_set() jaoks lukustatud, Apache'is ka .htaccess jaoks.

Kas tohin php_admin_value kirjutada .htaccess-faili?

Ei. PHP käsiraamatu järgi ei ole php_admin_value .htaccess-failides lubatud. See kuulub Apache'i serverikonfiguratsiooni või VirtualHosti, PHP-FPM-i puhul pooli faili.

Mis juhtub, kui rakendus tahab lukustatud väärtust muuta?

Käsu ini_set() kutse ebaõnnestub ja tagastab false, lukustatud väärtus jääb kehtima. Hästi programmeeritud rakendused saavad sellega hakkama. Kontrollige pärast ümberlülitust siiski vealogi ja tähtsamaid funktsioone.

Kas pean pärast pooli muutmist taaskäivitama?

Jah. PHP-FPM loeb pooli faile käivitamisel või teenuse uuesti laadimisel. Apache'is mod_php-ga kehtib sama serverikonfiguratsiooni kohta. Ilma taaskäivituseta jätkab vana väärtus.

Kas disable_functions'i saab poolis laiendada?

Jah, ühe iseärasusega: PHP käsiraamatu järgi ei kirjuta disable_functions FPM-poolis php.ini väärtusi üle, vaid täiendab neid. Pool saab seega lisafunktsioone blokeerida, kuid ühtegi vabastada ei saa.

Allikad

Kohene kontakt

Iga tund loeb. Kirjutage meile kohe.

Kirjeldage lühidalt süsteemi, PHP versiooni ja tähelepanekut. Võtame teiega ühendust, selgitame olukorra välja ja töötame kaugtööna, kuni intsident on lõpetatud ja dokumenteeritud.

Kohene abi