Kaj sploh SameSite je?
Atribut SameSite v HTTP glavi piškotkov kontrolira, kdaj se piškotek pošlje z zahtevkom do strežnika, da zaščiti aplikacije pred določenimi varnostnimi ranljivostmi, kot so:
- Cross-Site Request Forgery (CSRF) napadi, kjer zlonamerna spletna stran poskuša uporabiti sejo vašega uporabnika.
- Cross-site information leakage: Piškotki, ki se delijo med različnimi spletnimi mesti, kar lahko predstavlja tveganje za zasebnost.
Privzeti način obravnave piškotkov brez SameSite
Če piškotek nima definiranega SameSite atributa, bo brskalnik v prihodnosti obravnaval takšne piškotke kot SameSite=Lax. To pomeni, da:
- Piškotek NE bo poslan pri tretjeosebnih zahtevkih (third-party requests), kot na primer ob nalaganju vašega spletnega mesta znotraj iframe ali prek zahtevkov iz drugih domen.
- Piškotek BO poslan pri zahtevkih, ki izhajajo iz iste domene.
To opozorilo se pojavlja, ker se bo taka privzeta obravnava kmalu uveljavila.
Potrebna prilagoditev:
Če želite zagotoviti, da bo piškotek vključeno poslan v vseh kontekstih (tudi third-party), morate atribut SameSite nastaviti na None. Hkrati pa je obvezno, da dodate tudi atribut Secure, saj je to varnostna zahteva za piškotke s SameSite=None.
Rešitev v pravem kontekstu:
Dodajte SameSite=None in Secure za third-party uporabo, če piškotek potrebuje dostop tudi iz drugih domen, ga konfigurirajte tako:
- Set-Cookie: PH_HPXY_CHECK=value; SameSite=None; Secure
Dodajte SameSite=Lax ali SameSite=Strict za omejitev konteksta, če želite, da je piškotek poslan le v lastnem kontekstu, uporabite:
- SameSite=Lax (piškotek se pošlje v večini primerov, a ne v vseh third-party kontekstih)
- SameSite=Strict (piškotek se nikoli ne pošlje za third-party zahtevke)
Kako to rešiti v različnih jezikih?
1. PHP
V PHP-ju lahko ta atribut dodate, ko nastavite piškotke, z uporabo funkcije setcookie. Če uporabljate PHP 7.3 ali novejši, lahko dodate SameSite neposredno v konfiguraciji.
setcookie("PH_HPXY_CHECK", "value", [
"SameSite" => "None",
"Secure" => true, // Piškotek se pošilja samo prek HTTPS
"HttpOnly" => true // Izberite glede na vaše potrebe
]);
"SameSite" => "None",
"Secure" => true, // Piškotek se pošilja samo prek HTTPS
"HttpOnly" => true // Izberite glede na vaše potrebe
]);
Za starejše različice PHP-ja:
- header("Set-Cookie: PH_HPXY_CHECK=value; SameSite=None; Secure; HttpOnly");
2. JavaScript
Piškotek lahko nastavite s document.cookie:
- document.cookie = "PH_HPXY_CHECK=value; SameSite=None; Secure";
3. Nginx konfiguracija
Če piškotke nastavite prek HTTP strežnika (npr. Nginx), lahko dodate SameSite atribut v konfiguraciji strežnika:
- add_header Set-Cookie "PH_HPXY_CHECK=value; Path=/; SameSite=None; Secure";
4. Apache konfiguracija
Za Apache HTTP strežnik uporabite direktivo Header v konfiguraciji:
- Header always add Set-Cookie "PH_HPXY_CHECK=value; Path=/; SameSite=None; Secure"
Kdaj uporabiti katere vrednosti za SameSite?
1. SameSite=Strict:
Uporabite to nastavitev za piškotke, ki jih želite omejiti samo na zahteve, ki se zgodijo z vašega lastnega spletnega mesta.
- Primerno za piškotke, ki hranijo občutljive podatke uporabnika.
2. SameSite=Lax:
To je varna privzeta nastavitev. Piškotek se bo poslal samo pri navigaciji znotraj iste domene. Ne bo poslan pri cross-site zahtevkih.
- Uporabljajte, če želite dodatno zaščito pred CSRF napadi.
3. SameSite=None; Secure:
To je edina možnost, če želite, da se piškotek pošlje v third-party kontekstih.
- Uporabljajte za integracije (npr. iframe, CDN aplikacije in API-ji).
Zaključek:
To opozorilo je tukaj, ker brskalniki, kot je Google Chrome, zdaj privzeto obravnavajo piškotke brez SameSite atributa kot SameSite=Lax. Če vaša aplikacija za pravilno delovanje potrebuje dostop do teh piškotkov v third-party kontekstih (npr. na drugi domeni), morate atribut SameSite nastaviti na None in dodati Secure.