Lühidalt: HTTP ei mäleta kahe päringu vahel midagi. PHP sessioon lahendab selle: PHP annab juhusliku sessiooni ID, saadab selle küpsisena brauserile ja salvestab kuuluvad andmed serveris, vaikimisi failina. Igal järgmisel päringul loeb session_start() andmed ID järgi uuesti sisse. PHP sessiooni juurde kuulub ka funktsioon session.upload_progress, mille php.net soovitab PHP2Shelli tõttu ajutiselt serveri poolel välja lülitada.
Miks veebirakendused sessioone vajavad
Iga päring veebiserverile on omaette. Ilma lisamehhanismita ei teaks pood „Ostukorv“ klõpsamisel enam, kes just midagi sinna pani, ja admin-ala peaks igal klõpsul parooli küsima. Sessioonid ühendavad üksikud päringud seansiks.
Otsustajale tähendab see: sessiooni ID on pärast sisselogimist sama palju väärt kui kasutajanimi ja parool kokku. Administraatoritele tähendab see: kus ja kuidas sessiooniandmed asuvad, on turvaküsimus, eriti mitme veebisaidiga serverites.
Mis juhtub funktsiooniga session_start()
Kulg on igal päringul sama ja seda saab kirjeldada viies sammus:
- Brauser saadab kaasa sessiooni nimega küpsise, vaikimisi
PHPSESSID. session_start()loeb ID ja annab selle salvestuskäsitlejale, vaikimisifiles.- Käsitleja laadib salvestatud andmed, PHP muudab need
serialize_handlerabil tagasi ja täidab$_SESSION. - Skript loeb ja muudab
$_SESSIONnagu tavalist massiivi. - Päringu lõpus kirjutab PHP andmed tagasi. Sättega
session.lazy_write(vaikimisi: sees) ainult siis, kui need on muutunud.
<?php
session_start();
$_SESSION['besuche'] = ($_SESSION['besuche'] ?? 0) + 1;
echo 'Seitenaufrufe in dieser Sitzung: ', (int) $_SESSION['besuche'];
Kui sessiooni veel ei ole, loob PHP uue ID ja seab küpsise. Kui session.use_strict_mode on aktiivne, lükkab PHP brauseri poolt ette antud tundmatud ID-d tagasi ja loob uue. PHP käsiraamat nimetab seda sätet põhiturvalisuse jaoks kohustuslikuks.
Vaikeväärtused, mida tasub teada
Järgmised väärtused kehtivad PHP käsiraamatu järgi, kui midagi muud ei ole seadistatud. Paljud distributsioonid ja veebimajutajad seavad omad väärtused, seetõttu loeb alati tegelikult mõjus seadistus.
| Säte | Vaikeväärtus | Tähendus |
|---|---|---|
session.save_handler |
files |
andmete asukoht, võimalikud ka Redis või andmebaas |
session.name |
PHPSESSID |
küpsise nimi |
session.serialize_handler |
php |
salvestatud andmete vorming |
session.use_strict_mode |
0 |
tundmatud ID-d võetakse üle |
session.use_only_cookies |
1 |
sessiooni ID ei ole aadressis |
session.cookie_httponly |
0 |
JavaScript saab küpsist lugeda |
session.cookie_secure |
0 |
küpsis ka krüpteerimata HTTP kaudu |
session.cookie_samesite |
tühi | SameSite atribuuti ei ole |
session.gc_maxlifetime |
1440 |
sekundid võimaliku koristamiseni |
session.gc_probability / gc_divisor |
1 / 100 |
koristamine umbes igal sajandal käivitamisel |
session.upload_progress.enabled |
1 |
üleslaadimise edenemine kirjutatakse sessiooni |
Väärtused cookie_httponly, cookie_secure ja use_strict_mode ei ole seega tehasest turvalisuse jaoks mõeldud. Kuidas neid õigesti seada, kirjeldab juhend Sessioonide kaitsmine PHP-s. Sätted session.sid_length ja session.sid_bits_per_character on alates PHP 8.4.0-st märgitud vananenuks.
Küpsiste otse seadmine
Sessiooniküpsise kõrval võib rakendus seada omi küpsiseid. Alates PHP 7.3.0-st võtab setcookie() selleks vastu valikutega massiivi, kaasa arvatud samesite. Alates PHP 8.5.0-st on lisaks valik partitioned.
<?php
setcookie('sprache', 'de', [
'expires' => time() + 60 * 60 * 24 * 30,
'path' => '/',
'secure' => true,
'httponly' => true,
'samesite' => 'Lax',
]);
Käsiraamatu järgi peab samesite väärtuse None korral olema seatud ka secure, muidu blokeerib brauser küpsise. Küpsised on brauseri andmed: nende sisu tuleb järgmisel päringul tagasi $_COOKIE kaudu ja seda tuleb nagu iga muud sisendit kontrollida. Lisateavet lehel Superglobaalid.
session.upload_progress: üleslaadimiste edenemisnäit
PHP saab faili üleslaadimise ajal edenemise sessiooni kirjutada. Selleks saadab vorm peidetud välja nimega session.upload_progress.name sättest, vaikimisi PHP_SESSION_UPLOAD_PROGRESS. PHP paneb andmed seejärel $_SESSION võtme alla eesliitega upload_progress_, andmetega nagu algusaeg, kogusuurus ja juba töödeldud baidid.
Mõistmiseks on oluline: käsiraamatu järgi kirjutab PHP selle teabe sessiooni enne, kui ükski skript käivitub. Funktsioon töötab seega päringu töötlemise ajal, veel enne rakenduse koodi. Selle sätted on tüüpi INI_PERDIR ja neid ei saa käitusajal muuta.
Sessioonid ja PHP2Shell: ajutine meede
Ühe PHP2Shelli aukude vastase ajutise meetmena nimetab php.net, et session.upload_progress.enabled=0 tuleb seada failis php.ini, FPM-poolis või serveri seadistuses ja seejärel kõik workerid uuesti käivitada, selgesõnaliselt mitte ini_set() ega .user.ini kaudu. 23.10.2026 lisandus märkus CVE-2026-115560 kohta, sama abinõuga kuni järgmise tavapärase veaparanduse väljalaskeni.
; saidi FPM-pool, seejärel kõik workerid uuesti käivitada
php_admin_flag[session.upload_progress.enabled] = off
Erialaaruannete järgi ei sulge see säte üksi mõlemat auku. Kohustuslikuks jääb uuendus versioonile PHP 8.5.12, 8.4.27, 8.3.36 või 8.2.35. Kas teie rakendus üleslaadimise edenemist üldse kasutab ja kuidas sätet püsivalt seada, kirjeldab artikkel session.upload_progress väljalülitamine.
Kuidas PHP SOS konkreetselt aitab?
- Loeme veebisaidi kohta välja tegelikult mõjusad sessioonisätted, mitte ainult käsurea väärtused.
- Seame PHP2Shelli ajutised meetmed pooli kaupa, käivitame kõik workerid uuesti ja kontrollime tulemust.
- Eraldame sessioonide asukohad ja pooli kasutajad veebisaitide vahel serveri karastamise raames.
- Pärast intsidenti tühistame kõik olemasolevad seansid, et varastatud sessiooni ID-d muutuksid väärtusetuks.
Korduma kippuvad küsimused
Mis vahe on küpsisel ja sessioonil?
Küpsis on väike andmekirje, mille brauser salvestab ja igal päringul kaasa saadab. Sessioon salvestab tegelikud andmed serveris; küpsises on ainult juhuslik tunnus, sessiooni ID.
Kui kaua PHP sessioon elab?
Sessiooniküpsis kehtib vaikimisi, kuni brauser suletakse. Serveris olevaid andmeid tohib koristada pärast session.gc_maxlifetime, vaikimisi 1440 sekundit ilma ligipääsuta. Millal see tegelikult juhtub, sõltub süsteemi koristusloogikast.
Mida session.upload_progress teeb?
Funktsioon kirjutab faili üleslaadimise ajal edenemise sessiooni, et teine päring saaks seda kuvada. See on vaikimisi aktiivne. PHP2Shelli tõttu soovitab php.net seda ajutiselt serveri poolel välja lülitada.
Kas piisab session.upload_progress'i väljalülitamisest ini_set() abil?
Ei. Sätet ei saa käsiraamatu järgi nagunii käitusajal muuta ja php.net nimetab õigete kohtadena selgesõnaliselt php.ini, FPM-pooli või serveri seadistust, mitte ini_set() ega .user.ini. Seejärel kõik workerid uuesti käivitada.