Cookie sesyjne nie ma flagi Secure

Co to jest

Twoja strona ustawia cookie (zazwyczaj PHPSESSID, laravel_session, _ga itd.) bez flagi Secure. Przeglądarka będzie je wysyłać także przez nieszyfrowane HTTP, kiedy tylko nadarzy się okazja.

Dlaczego to problem

Atakujący, który ma dostęp do sieci między Tobą a użytkownikiem (Wi-Fi w kawiarni, skompromitowany router, dostawca internetu w kraju z aktywną inwigilacją), może:

Nawet jeśli masz HTTPS wszędzie, bez Secure wystarczy, by użytkownik miał w innej karcie otwartą dowolną stronę HTTP w tej samej domenie, a cookie wycieknie.

Jak to naprawić

Celem jest ustawienie wszystkich trzech flag bezpieczeństwa: Secure, HttpOnly oraz SameSite.

Cookies sesyjne (najważniejsze)

PHP:

# php.ini (nebo .htaccess s php_value)
session.cookie_secure = 1
session.cookie_httponly = 1
session.cookie_samesite = "Lax"

Node.js (express-session):

app.use(session({
    secret: process.env.SESSION_SECRET,
    cookie: {
        secure: true,
        httpOnly: true,
        sameSite: 'lax',
        maxAge: 1000 * 60 * 60 * 24,
    }
}));

Laravel (config/session.php):

'secure' => true,
'http_only' => true,
'same_site' => 'lax',

WordPress: WordPress obsługuje sesję przez cookies, ale nie dodaje Secure automatycznie. Użyj wtyczki Cookies Flags albo dodaj ręcznie:

// wp-config.php
define('COOKIE_DOMAIN', '.example.cz');
@ini_set('session.cookie_secure', 1);

// functions.php
add_action('init', function () {
    if (!is_ssl()) return;
    foreach ($_COOKIE as $name => $val) {
        setcookie($name, $val, [
            'expires'  => 0,
            'path'     => '/',
            'secure'   => true,
            'httponly' => true,
            'samesite' => 'Lax',
        ]);
    }
});

Cookies stron trzecich (analityka, retargeting)

Cookies ustawiane przez strony trzecie (Google Analytics, _fbp itd.) nie są pod Twoją kontrolą. Upewnij się przynajmniej, że ustawiasz je na stronie https:// — strona trzecia domyślnie doda wtedy flagę Secure.

Weryfikacja

DevTools → Application → Cookies. Spójrz na kolumnę Secure — powinna mieć wartość true dla wszystkich cookies, które niosą jakiekolwiek uwierzytelnienie.

Odnośniki