Dabartinė padėtis: PHP2Shell. Du kritiniai PHP pažeidžiamumai (CVSS 9,2) leidžia vykdyti kenkėjišką kodą be prisijungimo. Pataisos nuo 2026-10-21.Ką dabar daryti →

Sesijos ir slapukai PHP

Sesijos iš be būsenos HTTP padaro prisijungimą, kuris išlieka per kelis puslapius. Čia aprašyta, kaip PHP tai sprendžia viduje, kokios numatytosios reikšmės galioja ir ką session.upload_progress turi bendro su PHP2Shell.

Būsena 4 min. skaitymoPHP žinios

Trumpai: HTTP tarp dviejų užklausų nieko neprisimena. PHP sesija tai išsprendžia: PHP suteikia atsitiktinį sesijos ID, siunčia jį naršyklei kaip slapuką ir susijusius duomenis saugo serveryje, pagal numatymą kaip failą. Per kiekvieną tolesnę užklausą session_start() pagal ID vėl nuskaito duomenis. Prie PHP sesijos priklauso ir funkcija session.upload_progress, kurią php.net dėl PHP2Shell rekomenduoja laikinai išjungti serverio pusėje.

Kodėl žiniatinklio programoms reikia sesijų

Kiekviena užklausa žiniatinklio serveriui yra atskira. Be papildomo mechanizmo parduotuvė, paspaudus „Krepšelis“, nebežinotų, kas ką ką tik įdėjo, o administravimo sritis kiekvieną paspaudimą reikalautų slaptažodžio. Sesijos atskiras užklausas sujungia į seansą.

Sprendimų priėmėjams tai reiškia: po prisijungimo sesijos ID vertas tiek, kiek naudotojo vardas ir slaptažodis kartu. Administratoriams tai reiškia: kur ir kaip laikomi sesijos duomenys, yra saugumo klausimas, ypač serveriuose su keliomis svetainėmis.

Kas vyksta per session_start()

Eiga kiekvienai užklausai ta pati ir ją galima aprašyti penkiais žingsniais:

  1. Naršyklė siunčia slapuką su sesijos pavadinimu, pagal numatymą PHPSESSID.
  2. session_start() nuskaito ID ir perduoda jį saugojimo tvarkyklei, pagal numatymą files.
  3. Tvarkyklė įkelia išsaugotus duomenis, PHP paverčia juos atgal per serialize_handler ir užpildo $_SESSION.
  4. Skriptas skaito ir keičia $_SESSION kaip įprastą masyvą.
  5. Užklausos pabaigoje PHP įrašo duomenis atgal. Su session.lazy_write (numatytoji: įjungta) tik tada, kai jie pasikeitė.
<?php
session_start();

$_SESSION['besuche'] = ($_SESSION['besuche'] ?? 0) + 1;
echo 'Seitenaufrufe in dieser Sitzung: ', (int) $_SESSION['besuche'];

Jei sesijos dar nėra, PHP sukuria naują ID ir nustato slapuką. Jei session.use_strict_mode aktyvus, PHP atmeta naršyklės pateiktus nežinomus ID ir sukuria naują. PHP vadovas šį nustatymą pagrindiniam saugumui vadina privalomu.

Numatytosios reikšmės, kurias verta žinoti

Toliau pateiktos reikšmės pagal PHP vadovą galioja, kai nieko kita nesukonfigūruota. Daugelis distribucijų ir hostingo teikėjų nustato savas reikšmes, todėl visada svarbi iš tikrųjų veikianti konfigūracija.

Nustatymas Numatytoji Reikšmė
session.save_handler files duomenų saugojimo vieta, galimi ir Redis ar duomenų bazė
session.name PHPSESSID slapuko pavadinimas
session.serialize_handler php išsaugomų duomenų formatas
session.use_strict_mode 0 nežinomi ID priimami
session.use_only_cookies 1 sesijos ID nėra adrese
session.cookie_httponly 0 JavaScript gali skaityti slapuką
session.cookie_secure 0 slapukas ir per nešifruotą HTTP
session.cookie_samesite tuščia nėra SameSite atributo
session.gc_maxlifetime 1440 sekundės iki galimo sutvarkymo
session.gc_probability / gc_divisor 1 / 100 sutvarkymas maždaug per kas šimtą paleidimą
session.upload_progress.enabled 1 įkėlimo eiga įrašoma į sesiją

Taigi cookie_httponly, cookie_secure ir use_strict_mode reikšmės iš gamyklos nėra skirtos saugumui. Kaip jas nustatyti teisingai, aprašo vadovas Sesijų PHP apsauga. Nustatymai session.sid_length ir session.sid_bits_per_character nuo PHP 8.4.0 pažymėti kaip pasenę.

Slapukų nustatymas tiesiogiai

Greta sesijos slapuko programa gali nustatyti savus slapukus. Nuo PHP 7.3.0 setcookie() tam priima parinkčių masyvą, įskaitant samesite. Nuo PHP 8.5.0 papildomai yra parinktis partitioned.

<?php
setcookie('sprache', 'de', [
    'expires'  => time() + 60 * 60 * 24 * 30,
    'path'     => '/',
    'secure'   => true,
    'httponly' => true,
    'samesite' => 'Lax',
]);

Pasak vadovo, kai samesite lygus None, turi būti nustatytas ir secure, kitaip naršyklė slapuką blokuoja. Slapukai yra naršyklės duomenys: jų turinys per kitą užklausą grįžta per $_COOKIE ir kaip bet kuris kitas įvedimas turi būti tikrinamas. Daugiau puslapyje Superglobalūs kintamieji.

session.upload_progress: įkėlimų eigos rodymas

PHP failo įkėlimo metu gali įrašyti eigą į sesiją. Tam forma siunčia paslėptą lauką su pavadinimu iš session.upload_progress.name, pagal numatymą PHP_SESSION_UPLOAD_PROGRESS. Tuomet PHP duomenis $_SESSION deda po raktu su priešdėliu upload_progress_, su duomenimis, tokiais kaip pradžios laikas, bendras dydis ir jau apdoroti baitai.

Supratimui svarbu: pasak vadovo, PHP šią informaciją į sesiją įrašo prieš įvykdant bet kokį skriptą. Taigi funkcija veikia apdorojant užklausą, dar prieš programos kodą. Jos nustatymai yra tipo INI_PERDIR ir vykdymo metu keičiami negali būti.

Sesijos ir PHP2Shell: pereinamoji priemonė

Kaip vieną iš pereinamųjų priemonių nuo PHP2Shell spragų php.net nurodo nustatyti session.upload_progress.enabled=0 php.ini, FPM baseine ar serverio konfigūracijoje ir po to iš naujo paleisti visus darbinius procesus, aiškiai ne per ini_set() ar .user.ini. 2026-10-23 pridėta pastaba dėl CVE-2026-115560, su ta pačia pagalba iki kito eilinio klaidų taisymo leidimo.

; svetainės FPM baseinas, po to iš naujo paleisti visus darbinius procesus
php_admin_flag[session.upload_progress.enabled] = off

Pasak specialistų ataskaitų, vien šis nustatymas abiejų spragų neuždaro. Privalomas lieka atnaujinimas iki PHP 8.5.12, 8.4.27, 8.3.36 ar 8.2.35. Ar jūsų programa apskritai naudoja įkėlimo eigą ir kaip nustatymą nustatyti ilgalaikiai, aprašo straipsnis session.upload_progress išjungimas.

Kaip PHP SOS padeda konkrečiai?

  • Nuskaitome kiekvienos svetainės iš tikrųjų veikiančius sesijos nustatymus, o ne tik komandinės eilutės reikšmes.
  • PHP2Shell pereinamąsias priemones nustatome kiekvienam baseinui, iš naujo paleidžiame visus darbinius procesus ir tikriname rezultatą.
  • Serverio sutvirtinimo rėmuose atskiriame sesijų saugojimo vietas ir baseinų naudotojus tarp svetainių.
  • Po incidento panaikiname visas esamas sesijas, kad pavogti sesijos ID taptų bevertiai.

Dažni klausimai

Kuo skiriasi slapukas ir sesija?

Slapukas yra mažas duomenų įrašas, kurį naršyklė išsaugo ir siunčia kartu su kiekviena užklausa. Sesija tikruosius duomenis saugo serveryje; slapuke yra tik atsitiktinis identifikatorius, sesijos ID.

Kiek laiko gyvena PHP sesija?

Sesijos slapukas pagal numatymą galioja, kol užveriama naršyklė. Duomenys serveryje gali būti sutvarkyti po session.gc_maxlifetime, pagal numatymą 1440 sekundžių be prieigos. Kada tai iš tikrųjų įvyksta, priklauso nuo sistemos sutvarkymo logikos.

Ką daro session.upload_progress?

Funkcija failo įkėlimo metu įrašo eigą į sesiją, kad antra užklausa galėtų ją parodyti. Pagal numatymą ji aktyvi. Dėl PHP2Shell php.net rekomenduoja ją laikinai išjungti serverio pusėje.

Ar pakanka session.upload_progress išjungti per ini_set()?

Ne. Pasak vadovo, nustatymo vykdymo metu vis tiek pakeisti negalima, o php.net aiškiai kaip teisingas vietas nurodo php.ini, FPM baseiną ar serverio konfigūraciją, o ne ini_set() ar .user.ini. Po to iš naujo paleisti visus darbinius procesus.

Šaltiniai

Skubus kontaktas

Kiekviena valanda svarbi. Parašykite mums dabar.

Trumpai aprašykite sistemą, PHP versiją ir pastebėjimus. Mes atsakysime, išsiaiškinsime padėtį ir dirbsime nuotoliu, kol incidentas bus užbaigtas ir dokumentuotas.

Skubi pagalba