# Süti: HttpOnly

> A teszt azt nézi, kapnak-e HttpOnly jelzőt a munkamenet-jellegű sütik; nélküle az oldalon futó bármelyik szkript elolvashatja őket.

A `HttpOnly` jelzővel ellátott sütit a böngésző nem engedi olvasni JavaScriptből (például a `document.cookie` útján), csak a szervernek küldi el a kérésekkel. Ha a munkamenet-süti nem `HttpOnly`, egy XSS-hiba esetén a támadó szkriptje kiolvashatja, és a látogató munkamenetét átveheti. Az MDN azt is megjegyzi, hogy a `HttpOnly` süti a JavaScripttel indított kérésekkel továbbra is elmegy a szerverre: a jelző az olvasást tiltja, a küldést nem.

## Hogyan mérjük

A riport letölti a kezdőoldalt (legfeljebb 5 átirányítást követ), és a **végső válasz** `Set-Cookie` fejléceit nézi meg. Itt nem minden sütit vizsgál, csak a munkamenet-jellegű nevűeket. Egy süti akkor számít munkamenet-jellegűnek, ha a neve (kis- és nagybetűre való tekintet nélkül):

- tartalmazza ezek valamelyikét: `sess`, `token`, `auth`, `login`;
- pontosan `sid`, vagy `_sid`-re végződik;
- `PHPSESSID`;
- `wordpress_logged_in`-nel vagy `wp_woocommerce_session`-nel kezdődik.

| Eredmény | Mikor |
|---|---|
| Megfelelő | minden munkamenet-jellegű süti kapott `HttpOnly` jelzőt, vagy nincs ilyen süti |
| Hiba | legalább egy munkamenet-jellegű süti `HttpOnly` nélkül érkezik (a riport a darabszámot és legfeljebb 10 nevet mutatja) |
| Nem értékelhető | az oldal egyáltalán nem küld sütit |

Más nevű sütit (például analitikai vagy beállítássüti) nem vizsgál. Csak a kezdőoldal fejléceit látja, a JavaScripttel létrehozott sütiket nem (ezeken a `HttpOnly` eleve nem is állítható be).

## Hogyan javítsd

A jelzőt az a kód állítja be, amelyik a sütit kiadja. A riport kódrészlete csak a PHP munkamenet-sütijére (`PHPSESSID`) szól; a többit annál kell beállítani, ami küldi (bővítmény, webáruház, alkalmazás).

### PHP (php.ini)

Ha a `PHPSESSID` a hibás süti:

```ini title="php.ini"
session.cookie_httponly = 1
```

A php.net szerint ez a beállítás megjelöli a munkamenet-sütit úgy, hogy csak a HTTP-protokollon át érhető el, szkriptnyelvből (például JavaScriptből) nem. Alapértéke kikapcsolt. Kérheted a tárhelytől is.

### PHP-kód

Saját kódban a `setcookie()` tömbös alakja (PHP 7.3-tól):

```php title="PHP"
setcookie( 'nev', 'ertek', [ 'secure' => true, 'httponly' => true, 'samesite' => 'Lax' ] );
```

### nginx (ha proxy mögött küldi a süti)

Az nginx `proxy_cookie_flags` direktívája (1.19.3-tól) a továbbított sütikre kapcsol jelzőt:

```nginx title="nginx"
proxy_cookie_flags ~ httponly;
```

### Bővítmény vagy alkalmazás

Ha a sütit egy bővítmény vagy webáruház adja, annak beállításában (vagy a fejlesztőjénél) keresd a `HttpOnly` jelzőt. Ha egy süti szándékosan JavaScriptből is olvasható kell legyen, az nem lehet munkamenet-süti, és a neve se utaljon erre.

## Hogyan ellenőrizd

Futtasd újra a riportot, vagy nézd meg parancssorban:

```bash title="Terminál"
curl -sI "https://pelda.hu/?v=1" | grep -i '^set-cookie:'
```

A munkamenet-jellegű sütik sorában legyen ott a `HttpOnly`.
