CSRF (Cross-Site Request Forgery, po polsku „fałszowanie żądań międzywitrynowych”) to atak, w którym napastnik podstępem zmusza zalogowanego użytkownika do wykonania akcji, której ten wcale nie zamierzał — np. zmiany hasła, przelewu albo skasowania konta. Cały myk polega na tym, że to nie haker wysyła żądanie. Wysyła je przeglądarka ofiary, automatycznie dokładając jej ciasteczko sesyjne. Z punktu widzenia serwera wszystko wygląda jak najnormalniejsze, autoryzowane kliknięcie.
Jak to działa
Przeglądarka ma uprzejmy zwyczaj: do każdego żądania na dany adres dokleja zapisane tam ciasteczka — także wtedy, gdy żądanie wychodzi z zupełnie innej strony. Napastnik wykorzystuje to, podsuwając ofierze spreparowany formularz albo obrazek, który po cichu strzela do wrażliwej aplikacji.
Warunki ataku są proste: ofiara jest zalogowana (ma aktywną sesję), a serwer ufa samemu ciasteczku jako dowodowi intencji. CSRF nie kradnie danych ani sesji — wymusza akcję. To odróżnia go od XSS, który wstrzykuje i wykonuje cudzy kod w przeglądarce.
Przykład z praktyki
Ofiara jest zalogowana w banku. Wchodzi na podstawiony przez napastnika serwis, a tam ukryty formularz:
JavaScript robi form.submit() od razu po załadowaniu strony. Przeglądarka dokleja ciasteczko sesyjne banku, serwer widzi poprawną sesję — i przelew idzie. Ofiara niczego nie kliknęła świadomie.
Jak się bronić i czego nie mylić
Standardowa obrona to anti-CSRF token (synchronizer token pattern): serwer wstawia w formularz losowy, jednorazowy token, którego obca strona nie zna i nie odczyta. Drugi filar to atrybut ciasteczka SameSite — ustawienie SameSite=Lax lub Strict sprawia, że ciasteczko nie leci przy żądaniach z innej domeny. Bywa też wzorzec double-submit cookie.
Najczęstszy mit: „mamy HTTPS, więc jesteśmy bezpieczni”. HTTPS szyfruje transport, a nie weryfikuje intencji — na CSRF nie pomaga w ogóle. Drugi błąd: zakładanie, że GET jest niewinny. Jeśli żądaniem GET da się zmienić stan (np. /usun?id=5), to też wektor ataku. Nie polegaj też wyłącznie na sprawdzaniu nagłówka Referer — bywa pusty lub blokowany.
Pojęcia powiązane
XSS (Cross-Site Scripting), SameSite cookies, sesja i ciasteczka sesyjne, tokeny CSRF, SOP (Same-Origin Policy), CORS, OWASP Top 10.