2012-07-23 17 views
7

Jako początkujący na ciasteczka, CSRF i Django (używając 1.4), z tego co mogę zrobić z tym jak to działa, proszę mnie poprawić, gdzie udać ...Czy tak działa ochrona CSRF Django?

Ponizsze odnosi gdzie django.middleware. csrf.CsrfViewMiddleware jest zawarty w krotce MIDDLEWARE_CLASSES.

Jeśli formularz POST zawiera znacznik csrf_token, a dany widok przechodzi do szablonu RequestContext, żądanie strony oznacza, że ​​Django zawiera ukryte pole formularza zawierające ciąg alfanumeryczny. Django zwraca również do przeglądarki plik cookie o nazwie ustawionej na csrftoken i wartości ustawionej na ten sam ciąg alfanumeryczny.

Po otrzymaniu zgłoszenia formularza, Django sprawdza, czy alfanumeryczna wartość ciągu z pola ukrytego jest zgodna z plikiem cookie csrftoken otrzymanym z przeglądarki. Jeśli nie są zgodne, zostanie wydana odpowiedź 403.

Atak CSRF może przyjść w postaci złośliwej strony internetowej zawierającej element iframe. Element iframe zawiera formularz POST i trochę skryptów JavaScript. Atrybut formularza action wskazuje na moją witrynę Django. Formularz jest przeznaczony do zrobienia czegoś nieprzyjemnego na mojej stronie, a JS przesyła formularz po załadowaniu elementu iframe.

Przeglądarka będzie zawierać plik cookie csrftoken w nagłówku przesłania formularza. Jednak formularz nie zawierałby ukrytego pola z pasującym ciągiem alfanumerycznym, więc 403 jest zwracany i atak się nie powiódł. Jeśli element iframe JS próbował uzyskać dostęp do pliku cookie, aby utworzyć poprawne pole formularza hiddden, przeglądarka uniemożliwiłaby to działanie.

Czy to prawda?

+1

Nie widzę niczego złego. Może inni będą, ale generalnie, dostaliście to. – Zashas

Odpowiedz

0

Powiedziałbym, że masz rację. Znajdziesz moją własną formułę tego: here.

Podsumowując:

  • CSRF token wysłane z kodu, co oznacza, że ​​złośliwy kod musi go znać.
  • Token CSRF jest przechowywany w pliku cookie i wysyłany przez przeglądarkę.
  • Osoba atakująca nie może uzyskać dostępu do pliku cookie z powodu polityki tego samego pochodzenia.
  • Serwer może po prostu sprawdzić, czy "bezpieczna" wartość pochodząca z pliku cookie jest taka sama, jak wartość pochodząca z kodu.
1

Myślę, że to, co chcesz, jest opisane tutaj w oficjalnej dokumentacji Django. https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#how-it-works

powyższy link został złamany, gdy próbowałem, ale dla wersji 1.7 to działa: https://docs.djangoproject.com/en/1.7/ref/contrib/csrf/

+1

Dzięki za link. Mówi "Zapewnia to, że tylko formularze, które pochodzą z Twojej witryny sieci Web, mogą zostać wykorzystane do odzyskania danych POST". ale nie mówi, że to zapewnia. –

+0

Nie widziałem ostatnio tej części bazy kodu Django, ale jeśli wiem, z innego źródła, używa UrlParse do wykrycia podstawowego adresu URL i jeśli podstawowy URL nie odpowiada adresowi URL hosta, zwróci błąd lub po cichu zawiedzie. (Cicho zawiedzie, gdy próbujesz zwrócić odpowiedź do innego schematu, na przykład foo: // – fundamol