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:
- Naršyklė siunčia slapuką su sesijos pavadinimu, pagal numatymą
PHPSESSID. session_start()nuskaito ID ir perduoda jį saugojimo tvarkyklei, pagal numatymąfiles.- Tvarkyklė įkelia išsaugotus duomenis, PHP paverčia juos atgal per
serialize_handlerir užpildo$_SESSION. - Skriptas skaito ir keičia
$_SESSIONkaip įprastą masyvą. - 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.