Röviden: A HTTP két kérés között semmire sem emlékszik. A PHP-munkamenet ezt oldja meg: a PHP véletlenszerű munkamenet-azonosítót oszt ki, cookie-ként elküldi a böngészőnek, a hozzá tartozó adatokat pedig a szerveren tárolja, alapértelmezetten fájlként. Minden további kérésnél a session_start() az azonosító alapján újra beolvassa az adatokat. A PHP-munkamenethez tartozik a session.upload_progress funkció is, amelyet a php.net a PHP2Shell miatt átmenetileg szerveroldalon kikapcsolni javasol.
Miért kellenek a webalkalmazásoknak munkamenetek
A webszerverhez érkező minden kérés önálló. Kiegészítő mechanizmus nélkül egy webshop a „Kosár” gombra kattintva már nem tudná, ki tett bele az imént valamit, és egy admin felület minden kattintásnál a jelszót kérdezné. A munkamenetek az egyes kéréseket összekötik egyetlen munkamenetté.
Döntéshozóknak ez azt jelenti: a munkamenet-azonosító a bejelentkezés után ugyanannyit ér, mint a felhasználónév és a jelszó együtt. Adminisztrátoroknak ez azt jelenti: hogy hol és hogyan vannak a munkamenet-adatok, az biztonsági kérdés, különösen több weboldalt kiszolgáló szervereken.
Mi történik a session_start() hívásakor
A folyamat minden kérésnél ugyanaz, és öt lépésben írható le:
- A böngésző elküldi a munkamenet nevét viselő cookie-t, alapértelmezetten
PHPSESSID. - A
session_start()kiolvassa az azonosítót, és átadja a tárolókezelőnek (handler), alapértelmezettenfiles. - A kezelő betölti a tárolt adatokat, a PHP a
serialize_handlersegítségével visszaalakítja őket, és feltölti a$_SESSIONtömböt. - A szkript a
$_SESSIONtömböt egy szokásos tömbként olvassa és módosítja. - A kérés végén a PHP visszaírja az adatokat. A
session.lazy_writebeállítással (alapértelmezett: be) csak akkor, ha megváltoztak.
<?php
session_start();
$_SESSION['besuche'] = ($_SESSION['besuche'] ?? 0) + 1;
echo 'Seitenaufrufe in dieser Sitzung: ', (int) $_SESSION['besuche'];
Ha még nincs munkamenet, a PHP új azonosítót hoz létre, és beállítja a cookie-t. Ha a session.use_strict_mode aktív, a PHP elutasítja a böngésző által megadott, ismeretlen azonosítókat, és újat hoz létre. A PHP-kézikönyv ezt a beállítást az alapvető biztonsághoz kötelezőnek nevezi.
Alapértékek, amelyeket ismerni kell
A következő értékek a PHP-kézikönyv szerint akkor érvényesek, ha semmi mást nem konfiguráltak. Sok disztribúció és tárhelyszolgáltató saját értékeket állít be, ezért mindig a ténylegesen érvényes konfiguráció számít.
| Beállítás | Alapérték | Jelentés |
|---|---|---|
session.save_handler |
files |
az adatok tárolóhelye, Redis vagy adatbázis is lehetséges |
session.name |
PHPSESSID |
a cookie neve |
session.serialize_handler |
php |
a tárolt adatok formátuma |
session.use_strict_mode |
0 |
az ismeretlen azonosítókat átveszi |
session.use_only_cookies |
1 |
nincs munkamenet-azonosító a címben |
session.cookie_httponly |
0 |
a JavaScript olvashatja a cookie-t |
session.cookie_secure |
0 |
a cookie titkosítatlan HTTP-n is megy |
session.cookie_samesite |
üres | nincs SameSite attribútum |
session.gc_maxlifetime |
1440 |
másodperc a lehetséges takarításig |
session.gc_probability / gc_divisor |
1 / 100 |
takarítás nagyjából minden századik indításnál |
session.upload_progress.enabled |
1 |
a feltöltés állapota a munkamenetbe íródik |
A cookie_httponly, cookie_secure és use_strict_mode értékei tehát gyárilag nincsenek a biztonságra kialakítva. Hogyan állítsa be őket helyesen, azt a Munkamenetek védelme PHP-ban útmutató írja le. A session.sid_length és a session.sid_bits_per_character beállításokat a PHP 8.4.0 óta elavultként jelölték meg.
Cookie-k közvetlen beállítása
A munkamenet-cookie mellett az alkalmazás saját cookie-kat is beállíthat. A PHP 7.3.0 óta a setcookie() erre egy beállításokat tartalmazó tömböt fogad el, a samesite is beleértve. A PHP 8.5.0 óta ezen felül van egy partitioned beállítás is.
<?php
setcookie('sprache', 'de', [
'expires' => time() + 60 * 60 * 24 * 30,
'path' => '/',
'secure' => true,
'httponly' => true,
'samesite' => 'Lax',
]);
A kézikönyv szerint a samesite None értéke esetén a secure beállításnak is aktívnak kell lennie, különben a böngésző blokkolja a cookie-t. A cookie-k a böngésző adatai: a tartalmuk a következő kérésnél a $_COOKIE útján tér vissza, és mint minden más bemenetet, ellenőrizni kell. Erről bővebben a Szuperglobálisok oldalon.
session.upload_progress: folyamatjelző a feltöltésekhez
A PHP fájlfeltöltés közben a munkamenetbe írhatja a folyamat állapotát. Ehhez az űrlap egy rejtett mezőt küld a session.upload_progress.name szerinti névvel, alapértelmezetten PHP_SESSION_UPLOAD_PROGRESS. A PHP az adatokat ezután egy upload_progress_ előtagú kulcs alatt helyezi el a $_SESSION tömbben, olyan adatokkal, mint a kezdési idő, a teljes méret és a már feldolgozott bájtok.
A megértéshez fontos: a kézikönyv szerint a PHP ezeket az információkat azelőtt írja a munkamenetbe, hogy bármely szkript lefutna. A funkció tehát a kérés feldolgozása közben dolgozik, még az alkalmazáskód előtt. A beállításai INI_PERDIR típusúak, és futásidőben nem módosíthatók.
Munkamenetek és PHP2Shell: az átmeneti intézkedés
A PHP2Shell-rések elleni egyik átmeneti intézkedésként a php.net a session.upload_progress.enabled=0 beállítást nevezi meg a php.ini-ben, az FPM-poolban vagy a szerverkonfigurációban, majd az összes worker újraindítását, kifejezetten nem az ini_set() vagy a .user.ini útján. 2026. október 23-án jött hozzá a CVE-2026-115560 közlemény, ugyanazzal az elhárítással a következő rendes hibajavító kiadásig.
; a weboldal FPM-poolja, utána az összes workert újra kell indítani
php_admin_flag[session.upload_progress.enabled] = off
A szakmai jelentések szerint ez a beállítás önmagában nem zárja be mindkét rést. Kötelező marad a PHP 8.5.12, 8.4.27, 8.3.36 vagy 8.2.35 verzióra való frissítés. Hogy az alkalmazása használja-e egyáltalán a feltöltési folyamatjelzőt, és hogyan állíthatja be tartósan a beállítást, azt a A session.upload_progress kikapcsolása cikk írja le.
Hogyan segít konkrétan a PHP SOS?
- Weboldalanként kiolvassuk a ténylegesen érvényes munkamenet-beállításokat, nem csak a parancssor értékeit.
- A PHP2Shell átmeneti intézkedéseit poolonként állítjuk be, újraindítjuk az összes workert, és ellenőrizzük az eredményt.
- A szerver-megerősítés keretében elkülönítjük a munkamenetek tárolóhelyeit és a pool-felhasználókat a weboldalak között.
- Incidens után elvetjük az összes fennálló munkamenetet, hogy az ellopott munkamenet-azonosítók értéktelenné váljanak.
Gyakori kérdések
Mi a különbség a cookie és a munkamenet között?
A cookie egy kis adatrekord, amelyet a böngésző tárol, és minden kéréssel együtt elküld. A munkamenet a tényleges adatokat a szerveren tárolja; a cookie-ban csak egy véletlenszerű azonosító van, a munkamenet-azonosító (session ID).
Meddig él egy PHP-munkamenet?
A munkamenet-cookie alapértelmezetten addig érvényes, amíg a böngészőt be nem zárják. A szerveren lévő adatok a session.gc_maxlifetime után, alapértelmezetten hozzáférés nélküli 1440 másodperc után takaríthatók. Hogy ez mikor történik meg ténylegesen, az a rendszer takarítási logikájától függ.
Mit csinál a session.upload_progress?
A funkció fájlfeltöltés közben a munkamenetbe írja a folyamat állapotát, hogy egy második kérés megjeleníthesse. Alapértelmezetten aktív. A PHP2Shell miatt a php.net azt javasolja, hogy átmenetileg szerveroldalon kapcsolják ki.
Elég a session.upload_progress kikapcsolása az ini_set() útján?
Nem. A beállítás a kézikönyv szerint amúgy sem módosítható futásidőben, és a php.net kifejezetten a php.ini-t, az FPM-poolt vagy a szerverkonfigurációt nevezi meg helyes helyként, nem az ini_set()-et vagy a .user.ini-t. Utána az összes workert újra kell indítani.