Ryzyko związane z CSRF polega na tym, że witryna zewnętrzna może wysyłać dane do twoich, a przeglądarka użytkowników automatycznie wyśle wraz z nią plik cookie uwierzytelniający.
To, czego potrzebujesz, to sposób odbierania danych (metoda $.ajax()
wysyła dane POST), aby sprawdzić, czy żądanie pochodzi z innej strony witryny, a nie z witryny zewnętrznej.
Istnieje kilka sposobów, aby to zrobić, ale zalecanym sposobem jest dodanie tokena do żądania, które można sprawdzić i do którego hakerzy nie mogą się dostać.
Mówiąc najprościej:
- W dzienniku na stworzenie długiej losowy ciąg żeton i uratować ją przed użytkownikiem.
- Dodaj parametr do żądania
$.ajax()
, który zawiera token.
- Na żądanie sprawdź, czy token pasuje do tego, który zapisałeś dla użytkownika.
- Jeśli token nie pasuje, masz hak CSRF.
Haker nie może dostać się do DB, a nie w rzeczywistości może odczytać stronie zostały wysłane do użytkownika (o ile nie dostać ataku XSS w, ale to już inny problem), więc nie można sfałszować znak.
Wszystko się liczy z tokena jest można przewidzieć (i potwierdzić) to i że haker nie może.
Z tego powodu najłatwiej jest wygenerować coś długiego i losowego i zapisać go w bazie danych, ale zamiast tego można utworzyć coś zaszyfrowanego. Nie powiedziałbym jednak po prostu nazwy użytkownika MD5 - jeśli atakujący CSRF dowiedzą się, jak wygenerować tokeny, zostaniecie zhackowani.
Innym sposobem jest zapisanie tokena w pliku cookie (zamiast w bazie danych), ponieważ osoby atakujące nie mogą czytać ani zmieniać plików cookie, tylko powodują ich ponowne wysłanie. Następnie jesteś tokenem w tokenie dopasowań danych POST HTTP w pliku cookie.
Możesz uczynić te o wiele bardziej wyrafinowane, na przykład token, który zmienia się za każdym razem, gdy został pomyślnie użyty (uniemożliwia ponowne przesłanie) lub tokenem specyficznym dla użytkownika i działania, ale to jest podstawowy wzorzec.
W jaki sposób użytkownik może przesłać żądanie AJAX z innej strony internetowej, mimo że [Zasady tego samego pochodzenia] (https://en.wikipedia.org/wiki/Same-origin_policy) uniemożliwia takie zachowanie? – Songo
@Songo nie wszystkie przeglądarki obsługują to, niestety. Mnóstwo serwerów proxy rozbiera nagłówki i łamie to również. W końcu możesz POST spoza pochodzenia, więc nawet jeśli zamierzasz AJAX na to nie znaczy to, że będzie to atakujący. Zasadniczo powinieneś mieć zasady tego samego pochodzenia, ale ponieważ opiera się na dobrze zachowanych przeglądarkach, nie powinieneś na nich polegać. Korzystanie z tokenu CSRF daje ci coś, co możesz zweryfikować, nawet jeśli omijane jest to samo pochodzenie. – Keith
@Songo nawet z najnowszą wersją Chrome, nadal możesz wykonywać żądania GET (tj. '' '' '' tag na stronie internetowej) i to zadziała. @Keith Nie ufałbym plikowi cookie, ponieważ przeglądarka automatycznie wysyła plik cookie na stronę dla każdego żądania. Jeśli atakujący używa ramki iFrame lub formularza, plik cookie zostanie automatycznie wysłany, jak sądzę. – arleslie