2012-02-01 19 views
25

Więc mam podstawową metodę .ajax() POST do pliku PHP.Czy potrzebuję tokena CSRF dla jQuery .ajax()?

Jakie środki bezpieczeństwa są mi potrzebne?

Kilka postów wspomniało o użyciu ukrytego pola wejściowego MD5, które wysyłasz za pośrednictwem AJAX i weryfikujesz w pliku PHP. Czy to wystarczająco dobra metoda?

Odpowiedz

34

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.

+6

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

+3

@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

+0

@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

2

Jeśli chodzi o fałszowanie wniosków, nie ma znaczenia, w jaki sposób klient wysyła żądanie, ma znaczenie, w jaki sposób je otrzymał. Te same zasady CSRF dotyczą posta ajaxowego, jak każdego innego typu postu.

Polecam lekturę CSRF prevention cheat sheet. Używanie tokenu tajnego dla każdego użytkownika jest najczęstszą formą ochrony.

+2

Dość powszechne jest również żądanie tokenów per-jednorazowa, nabył dla konkretnego użytkownika i wyłączone po pierwszym użyciu. – Tadeck

+2

@Tadeck Takie podejście jest bardziej użyteczne w zapobieganiu podwójnemu przesyłaniu niż w przypadku CSRF. – rook

+2

Jak stwierdzono w [źródle, do którego się odwołałeś] (https://www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29_Prevention_Cheat_Sheet), jednorazowe tokeny to bardzo silne zabezpieczenia używane w funkcjach wysokiego ryzyka. Jest to coś przeciwnego niż bycie "bardziej użytecznym w zapobieganiu podwójnemu podporządkowaniu niż CSRF_", jest to bardziej rygorystyczny sposób zabezpieczenia aplikacji przed CSRF. – Tadeck

0

Nie jest potrzebny token, ale nadal należy chronić funkcje zmieniające stan na CSRF.

Jednym z prostych sposobów jest dodanie nagłówka wysyłanego z żądaniem AJAX. Nie jest potrzebny losowy token.

To działa, ponieważ:

  • formularze HTML nie może mieć niestandardowe nagłówki dodane do nich przez atakującego.
  • Nie można przekazywać niestandardowych nagłówków między domenami bez włączonego mechanizmu CORS.

Oczywiście kod po stronie serwera musi się upewnić, że nagłówek jest obecny przed wykonaniem jego działania.

Więcej informacji: What's the point of the X-Requested-With header?

Powiązane problemy