2015-08-26 15 views
9

Moja witryna ma widok POST AJAX, który można wywołać z dowolnej strony w aplikacji (śledzenie zdarzeń). Ten widok jest chroniony przez CSRF. W niektórych przypadkach plik cookie CSRF nie jest ustawiony, a wywołanie POST kończy się niepowodzeniem.Django: Wymuszanie tokenu CSRF we wszystkich odpowiedziach

Zamiast ręcznie dekorować wszystkie widoki za pomocą @ensure_csrf_cookie, Zastanawiam się nad pisaniem Utworzyłem oprogramowanie pośrednie, które wymusza na Django ustawienie pliku cookie CSRF we wszystkich odpowiedziach. Czy to podejście jest prawidłowe? Czy tworzy on lukę bezpieczeństwa, której nie znam?

Aktualizacja: oto kod middleware:

from django.middleware.csrf import get_token 

class ForceCsrfCookieMiddleware(object): 
    def process_request(self, request): 
     get_token(request) 
+1

Bezpieczeństwa wada? Myślę, że nie. Ponieważ właśnie wdrażasz funkcjonalność 'ensure_csrf_cookie' w oprogramowaniu pośredniczącym. Mimo to przeczytaj kod źródłowy tego dekoratora. – xyres

Odpowiedz

1

Nie, nie ma problemu, tak długo, jak nie jesteś renderowania token CSRF wewnątrz formie stanowisk do zewnętrznej strony (ale to i tak byłby problem, bez względu na to, gdzie go zaimplementujesz). Możesz ustawić to na oprogramowaniu pośredniczącym, niektórych widokach lub we wszystkich widokach, to nie ma znaczenia.

Ochrona CSRF ma na celu zapewnienie, że żądanie pochodzi z Twojej witryny. Bez względu na to, jak często ustawisz plik cookie, jeśli żądanie zawiera prawidłowy token CSRF, oznacza to, że żądanie rzeczywiście pochodzi z Twojej witryny, ponieważ tylko twoja strona może uzyskać dostęp do twoich plików cookie. (Oczywiście to tylko trzyma, jeśli nie wycieka token CSRF osobom trzecim, na przykład wysyłając go do innych stron)

W kilku słowach, to jak to działa:

  1. zestawy serwerów ciasteczko o losowej wartości w odpowiedzi
  2. Twoja strona odczytuje tę wartość i wysyła ją na serwer podczas publikowania danych.
  3. Ponieważ pliki cookie są dostępne tylko z tej samej domeny, która je ustawiła, nie ma innej możliwości dla innej witryny przeczytać to ciasteczko. Dlatego za każdym razem, gdy otrzymasz żądanie z odpowiednim tokenem csrf, masz pewność, że żądanie pochodzi z Twojej witryny.

Na bardzo dobrym wyjaśnieniem CSRF, rzucić okiem na ten artykuł: http://www.gnucitizen.org/blog/csrf-demystified/

Powiązane problemy