2008-10-13 14 views
11

Jaki jest najlepszy sposób, aby zapobiec atakowi XSRF dla aplikacji GAE? Wyobraź sobie następujące:Jak najlepiej zapobiegać atakom CSRF w aplikacji GAE?

  1. Każdy może zobaczyć obiekt publiczny użytkownika, a identyfikator db.Model jest używany w żądaniu do ustalenia, który obiekt ma być wyświetlany. Złośliwi użytkownicy mają teraz identyfikator.
  2. Złośliwy użytkownik tworzy własny obiekt i sprawdza formularz usunięcia. Teraz wiedzą, jak usunąć obiekt o określonym identyfikatorze.
  3. Złośliwy użytkownik dostaje niewinnego użytkownika, który przesyła żądanie usunięcia obiektu tego użytkownika.

Co mogę zrobić, aby zapobieC# 3? Zwróć uwagę, że kiedy mówię ID, używam rzeczywistej części ID klucza. Jedną z moich pomysłów było użycie pełnej wartości klucza w żądaniach usunięcia, ale czy to uniemożliwiłoby złośliwemu użytkownikowi zrozumienie tego? O ile mi wiadomo, klucz jest kombinacją typu klasy modelu, identyfikatora aplikacji i identyfikatora wystąpienia obiektu, aby mogli prawdopodobnie wyprowadzić klucz z identyfikatora, jeśli chcieli.

Jakieś inne pomysły? Jeff napisał a post about this i zasugerował kilka metod - ukrytą wartość formularza, która zmienia się przy każdym żądaniu, oraz wartość cookie zapisaną przez js do formularza. Nie chcę wykluczać użytkowników nieobsługujących javascriptu, więc rozwiązanie ciasteczek nie jest dobre - w przypadku ukrytej wartości formularza musiałbym pisać zapis datastore na każdym żądaniu wyświetlającym obiekt usunięcia - nie jest to idealna sytuacja dla skalowalnego aplikacja!

Jakieś inne pomysły?

Odpowiedz

11

Po wygenerowaniu strony, która umożliwia użytkownikowi usunięcie obiektu, wygeneruj losowy token i umieść go w ukrytym polu formularza. Ustaw także plik cookie typu "tylko HTTP" o tej wartości. Po otrzymaniu żądania usunięcia sprawdź, czy losowy token z formularza i wartość z pliku cookie są zgodne.

Twój losowy token nie powinien być zwykłą liczbą losową. Powinieneś zaszyfrować kombinację losowej liczby i tożsamości użytkownika, aby utrudnić napastnikowi tworzenie własnych tokenów. Powinieneś także używać różnych kluczy szyfrowania dla wartości przechowywanej w formularzu i wartości przechowywanej w pliku cookie, więc jeśli jeden z tokenów wycieknie, napastnikowi wciąż trudno jest sfałszować drugi token.

To podejście sprawdza, czy żądanie usunięcia pochodzi z formularza, przez obecność tokena zabezpieczającego w formularzu; i nie wymaga zapisu w magazynie danych.

Podejście to jest nadal podatne na ataki typu cross-site scripting, w których osoba atakująca może odzyskać ukrytą wartość z formularza lub przesłać formularz, więc dokładnie przetestuj swoją witrynę pod kątem luk w zabezpieczeniach między lokacjami. Podejście to jest również podatne na ataki typu "clickjacking".

+0

Podobają mi się również podejście Makbirda, ale podoba mi się, że zapewnia to rozsądne bezpieczeństwo bez przechowywania po stronie serwera. –

5

Proste: Sprawdź odnośnik. Jest to (celowo) niemożliwe do ustawienia za pomocą Javascript, formularzy HTML itd. Jeśli jest puste (niektóre proxy i przeglądarki odrzucają paski) lub z własnej strony - lub dokładniej z oczekiwanego źródła - zezwól na to. W przeciwnym razie odmów i zapisz go.

Edytuj: Jeff napisał followup article kilkoma sposobami zapobiegania atakom CSRF.

+0

Tak więc, jeśli ktoś łączył się z moją witryną za pośrednictwem serwera proxy i napotkał atak XSRF, nie byłby chroniony? Jeff wspomniał również, że osoby odsyłające są łatwe do sfałszowania. Wiem, że jako użytkownik mogę z łatwością to zrobić, ale czy strona może w jakiś sposób przekonać przeglądarkę do zgłoszenia innej strony odsyłającej? –

+0

Będą one pozbawione ochrony tylko wtedy, gdy ich proxy lub przeglądarka usunie odnośnik. Bardzo niewielu to robi i chroniąc wszystkich ludzi, których możesz chronić, czynisz atak nieatrakcyjnym. I tak, odsyłające są możliwe do sfałszowania, ale żaden kod nie może przekonać użytkownika do wykonania w przeglądarce. –

+1

Nie zezwalaj na puste nagłówki Referer! Jeśli strona HTTPS zażąda strony HTTP, [Referer is not sent] (http://stackoverflow.com/a/1361720/691281). Jeśli więc formularz znajduje się na stronie HTTP, osoba atakująca może w sposób trywialny spowodować, że Referer będzie pusty w ataku CSRF. Nawet jeśli twój formularz znajduje się na stronie HTTPS, byłbym bardzo podejrzliwy wobec pustych nagłówków Referer. –

4

W odpowiedzi serwera wyświetlając formularz utwórz magiczny skrót (na podstawie klienta ip + data/czas + losowa sól, cokolwiek). Umieść go w ciasteczku i przechowuj gdzieś na serwerze. Podczas przesyłania działań należy sprawdzić wartość skrótu pliku cookie względem pozycji w bazie danych.

Jeśli nie ma takiego hasha lub jest inny, odrzuć zgłoszenie.

Po pomyślnym wysłaniu możesz usunąć hash, zmienić jego stan na wysłany - cokolwiek ci pasuje.

Ta metoda powinna chronić Cię w wielu przypadkach, ale z pewnością wciąż nie jest w 100% bezpieczna.

Poszukaj artykułów na temat CSRF, może znajdziesz kilka dobrych odpowiedzi na temat tego Stack Overflow rzeczy. ;)

Nie wykonuj żadnych sprawdzeń referrer lub sprawdzania poprawności IP klienta - jest to zbyt podatne na błędy (informacje odsyłające mogą być usuwane przez program użytkownika, proxy lub preferencje użytkownika), a adres IP klienta może się zmieniać między formularzami tworzenie i składanie - nie karaj użytkownika za przydzielanie dynamicznego adresu IP.

+0

Czy w silniku aplikacji nie trzeba zapisywać datastore za każdym razem, gdy wyświetlam opcję usunięcia? Nie mogę tego zrobić, ponieważ istnieje opcja usuwania na prawie każdej stronie, którą użytkownik odwiedza. –

+1

Tak, może generować zapis na każdym ekranie strony, ale tak naprawdę nie musi. Jeśli zmiany hashów zdarzają się bardzo często, możesz je przechowywać w pamięci memcache, chyba że twoja strona ma bardzo duży ładunek oczywiście. Inną opcją jest wygenerowanie wartości mieszania tylko wtedy, gdy użytkownik faktycznie kliknie przycisk "usuń", asynchronicznie. To musi być jednak dobrze przemyślane, ponieważ mogą pojawić się nowe problemy związane z bezpieczeństwem. – macbirdie