# Munkamenetek és cookie-k a PHP-ban

> Hogyan működnek a PHP-munkamenetek és cookie-k: munkamenet-azonosító, tárolás, a php.ini alapértékei, feltöltési folyamatjelző és a PHP2Shell átmeneti intézkedése.

Forrás: https://phpsos.de/hu/php/sessions-und-cookies/  
Állapot: 2026. 10. 25.  
Szolgáltató: PHP SOS, PHP-vészhelyzeti segítség és szerverbiztonság. Azonnali segítség WhatsAppon: https://wa.me/491736494914?text=%C3%9Cdv%C3%B6zl%C3%B6m%2C%20PHP%20SOS%21%20Seg%C3%ADts%C3%A9gre%20van%20sz%C3%BCks%C3%A9g%C3%BCnk%20a%20PHP-szerver%C3%BCnkkel.%20C%C3%A9g%3A%20%E2%80%A6%20Weboldal%3A%20%E2%80%A6

**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
<?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](https://phpsos.de/hu/ratgeber/session-sicherheit-php/) ú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
<?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](https://phpsos.de/hu/php/superglobals/) 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](https://phpsos.de/hu/php2shell/cve-2026-115560/) közlemény, ugyanazzal az elhárítással a következő rendes hibajavító kiadásig.

```ini
; 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](https://phpsos.de/hu/blog/session-upload-progress-abschalten/) 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](https://phpsos.de/hu/leistungen/server-haertung/) 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

- [PHP-kézikönyv: munkamenet-konfiguráció](https://www.php.net/manual/de/session.configuration.php)
- [PHP-kézikönyv: munkamenet feltöltési folyamatjelző](https://www.php.net/manual/de/session.upload-progress.php)
- [PHP-kézikönyv: setcookie](https://www.php.net/manual/en/function.setcookie.php)
- [php.net: Biztonsági közlemények](https://www.php.net/)
