Aktuális helyzet: PHP2Shell. Két kritikus PHP-rés (CVSS 9,2) lehetővé teszi kártékony kód futtatását bejelentkezés nélkül. Javítások 2026. 10. 21. óta.Mi a teendő most →

Munkamenetek és cookie-k a PHP-ban

A munkamenetek az állapot nélküli HTTP-ből több oldalon át tartó bejelentkezést csinálnak. Itt olvashatja, hogyan oldja ezt meg belsőleg a PHP, mely alapértékek érvényesek, és mi köze a session.upload_progress-nek a PHP2Shellhez.

Állapot 5 perc olvasási időPHP-tudástár

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:

  1. A böngésző elküldi a munkamenet nevét viselő cookie-t, alapértelmezetten PHPSESSID.
  2. A session_start() kiolvassa az azonosítót, és átadja a tárolókezelőnek (handler), alapértelmezetten files.
  3. A kezelő betölti a tárolt adatokat, a PHP a serialize_handler segítségével visszaalakítja őket, és feltölti a $_SESSION tömböt.
  4. A szkript a $_SESSION tömböt egy szokásos tömbként olvassa és módosítja.
  5. A kérés végén a PHP visszaírja az adatokat. A session.lazy_write beá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.

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.

Források

Azonnali kapcsolat

Minden óra számít. Írjon nekünk most.

Ismertesse röviden a rendszert, a PHP-verziót és a megfigyelését. Jelentkezünk, tisztázzuk a helyzetet, és távolról dolgozunk, amíg az incidens le nem zárul és dokumentálva nem lesz.

Azonnali segítség