Chroń swoją witrynę przed bardzo częstymi lukami w zabezpieczeniach dzięki wbudowanej obsłudze CSRF Django.

Django to platforma internetowa w języku Python, której można używać do tworzenia bezpiecznych aplikacji internetowych. Oferuje wiele funkcji, które pomagają programistom w zapewnieniu bezpieczeństwa. Jedną z tych funkcji są tokeny CSRF, niezbędne do ochrony formularzy przed atakami typu Cross-Site Request Forgery.

Co to jest token CSRF?

Token CSRF to funkcja bezpieczeństwa, która chroni aplikacje internetowe przed Ataki polegające na fałszowaniu żądań między witrynami (CSRF).. Pozwala serwerowi aplikacji sprawdzić, czy przesłany formularz pochodzi z autentycznej przeglądarki, czy też został sfałszowany przez hakera.

Tokeny CSRF to dane wejściowe formularzy, które śledzą sesję użytkownika. Strona internetowa framework aplikacji internetowych po stronie serwera zazwyczaj generuje tokeny CSRF dla każdej unikalnej sesji użytkownika. Serwer sprawdza poprawność tokena za każdym razem, gdy użytkownik przesyła formularz. Tokeny CSRF zazwyczaj składają się z losowych ciągów znaków i liczb, przez co ich wartości są nieprzewidywalne.

instagram viewer

Generowanie tokenów CSRF w Django

Django get_token() funkcja losowo generuje tokeny CSRF. Aby znaleźć tę funkcję, przejdź do csrf.py plik w twoim Środowisko wirtualne Pythona. Struktura folderów powinna wyglądać następująco:

Środowisko/

└── Lib/

└── pakiety witryn/

└── django/

└── oprogramowanie pośrednie/

└── csrf.py

Wewnątrz tego pliku znajdziesz plik get_token() funkcja, która zwraca token. używa Django maskowanie danych w celu ochrony wartości tokena przed hakerami.

Domyślnie Django włącza ochronę CSRF dla Twojej witryny poprzez dodanie django.middleware.csrf. CsrfViewMiddleware w OPROGRAMOWANIE ŚREDNIE lista twoich ustawienia.py plik. Wszystko, co musisz zrobić, to dodać {% csrf_token %} dla Twojej POST formy. Bez dodawania {% csrf_token %}, dostaniesz a 403 (zabronione) błąd podczas wysyłania formularza.

Kiedy dodasz {% csrf_token %} do formularza, automatycznie tworzy ukryte pole wprowadzania z nazwą csrfmiddlewaretoken, który zawiera wartość zamaskowanego tokenu CSRF. Serwer używa tej wartości do określenia, czy przesłany formularz jest autentyczny. Możesz sprawdzić wartość tego ukrytego pola, wyświetlając źródło strony lub korzystając z funkcji narzędzi programistycznych przeglądarki.

Jak działają tokeny CSRF w Django

Kiedy uruchamiasz witrynę za pomocą formularza, Django automatycznie tworzy plik plik cookie przeglądarki zwany csrftoken. Ten plik cookie śledzi aktywność użytkownika w witrynie i jednoznacznie identyfikuje każdego użytkownika.

Gdy użytkownik przesyła formularz, serwer porównuje wartość pliku cookie z wartością pliku csrfmiddlewaretoken w ukrytym polu wprowadzania. Jeśli te wartości są zgodne, serwer pomyślnie przetworzy formularz, w przeciwnym razie zgłosi błąd.

Na pierwszy rzut oka wartości pliku cookie i pliku csrfmiddlewaretoken wydają się być różne. Jest to zamierzone i dodaje dodatkową warstwę ochrony do tokena CSRF. Token CSRF jest porównywany z plikiem cookie w następujący sposób:

  • The get_token() funkcja maskuje token CSRF przed przekazaniem go do pola wejściowego.
  • Po przesłaniu formularza token CSRF zostaje zdemaskowany za pomocą tajnego klucza w pliku ustawień.
  • Niemaskowany token jest porównywany z sesyjnym plikiem cookie.
  • Jeśli wartości są takie same, formularz zostanie przetworzony. Jeśli nie, serwer zwraca błąd.

Aby uniemożliwić hakerom kradzież Twojego tokena CSRF, Django odnawia go za każdym razem, gdy rozpoczyna sesję użytkownika.

Tworzenie niestandardowych tokenów CSRF

Chociaż Django ułatwia ochronę formularzy, po prostu dodając rozszerzenie {% csrf_token %}, możliwe jest również generowanie tokenów CSRF i ręczne dodawanie ich do formularzy. W tym celu zaimportuj plik get_token() funkcjonować:

z django.middleware.csrf import get_token

Twoim zdaniem możesz wygenerować token CSRF w następujący sposób:

poknazwa_widoku(wniosek):
csrf_token = get_token (żądanie)

# wykonaj logikę widoku
kontekst = {
"csrf_token": csrf_token
}

powrót renderować (prośba, „nazwa_aplikacji/szablon.html”, kontekst=kontekst)

W szablonie HTML możesz ręcznie dołączyć tag wejściowy i dodać plik csrf_token do tego tak:

<formularzmetoda="POST" >
<wejścietyp="ukryty"nazwa=„csrfmiddlewaretoken”wartość="{{ csrf_token }}">
{{form.as_p}}
<przycisktyp="składać"klasa="btn btn-kontur-drugorzędny">Dodaj książkęprzycisk>
formularz>

Alternatywnie możesz wygenerować ukryte pole wprowadzania ze swoich widoków w następujący sposób:

pokTwój widok(wniosek):
csrf_token = get_token (żądanie)
csrf_token_html = ''.format (csrf_token)

# wykonaj logikę widoku
kontekst = {
"csrf_token": csrf_token_html
}

powrót renderować (prośba, „nazwa_aplikacji/szablon.html”, kontekst=kontekst)

Następnie możesz dodać go do szablonu HTML w następujący sposób:

<formularzmetoda="POST" >
{{ csrf_token_html|bezpieczny }}
{{form.as_p}}
<przycisktyp="składać"klasa="btn btn-kontur-drugorzędny">Dodaj książkęprzycisk>
formularz>

Jeśli chcesz całkowicie kontrolować ochronę CSRF swojego formularza, możesz to zrobić porównując token CSRF z plikiem cookie przechowywanym w przeglądarce. Na podstawie wyników porównania możesz dowolnie obsłużyć przesyłanie formularza. Oto przykład:

z django.skróty import renderowanie
z django.middleware.csrf import get_token, _unmask_cipher_token
z django.utils.crypto import porównanie_stałego_czasu

pokTwój widok(wniosek):
# Wygeneruj niestandardowy token CSRF
csrf_token = get_token (żądanie)
csrf_cookie = żądanie. COOKIES.get('csrftoken')

# zdemaskuj token csrf
unmasked_csrf_token = _unmask_cipher_token (csrf_token)

# Porównaj tokeny
Jeślinie const_time_compare (unmasked_csrf_token, csrf_cookie):
# Zajmij się przypadkiem, w którym tokeny nie pasują
przechodzić
w przeciwnym razie:
# Zajmij się przypadkiem, w którym tokeny pasują
przechodzić

# Renderuj szablon
kontekst = {
„csrf_token”: csrf_token,
}

powrót renderować (prośba, „nazwa_aplikacji/szablon.html”, kontekst=kontekst)

Ten fragment kodu pobiera plik csrf_cookie z obiektu żądania HTTP. Następnie używa tzw _unmask_cipher_token() funkcja, aby zdemaskować csrf_token.

Instrukcja warunkowa porównuje wartości pobranego csrf_cookie i zdemaskowany csrf_token. To porównanie wykorzystuje porównanie_stałego_czasu funkcja chroniąca przed exploitami związanymi z synchronizacją. Możesz napisać swoją logikę na podstawie wyniku porównania.

Wyłączanie ochrony CSRF w Django

Mimo że Django domyślnie zapewnia ochronę CSRF, możesz ją wyłączyć w swoim projekcie, jeśli chcesz. Można to zrobić na dwa sposoby:

  • Wyłączanie ochrony CSRF w całej witrynie.
  • Wyłączanie ochrony CSRF w określonym widoku.

Wyłączanie ochrony CSRF w całej witrynie

Aby wyłączyć ochronę CSRF Django na swojej stronie internetowej, wystarczy usunąć oprogramowanie pośrednie CSRF z pliku ustawień. W pliku ustawień znajdź listę o nazwie OPROGRAMOWANIE ŚREDNIE. Na liście wyszukaj to:

„django.middleware.csrf. CsrfView Oprogramowanie pośredniczące”,

Gdy go znajdziesz, powinieneś usunąć go ze swojego kodu, aby domyślna ochrona CSRF Django go wyłączyła.

Wyłączanie ochrony CSRF w określonym widoku

Jeśli chcesz wyłączyć ochronę CSRF tylko w określonym widoku Django, użyj metody @csrf_exempt dekorator. Oto fragment kodu do zademonstrowania:

z django.views.decorators.csrf import csrf_exempt

@csrf_exempt
poknazwa_widoku(wniosek):
# wykonaj logikę widoku
przechodzić

The @csrf_exempt decorator jest tylko jednym z kilku związanych z ochroną CSRF w Django. O reszcie można przeczytać na Odniesienie do CSRF Django.

Nie wyłączaj ochrony CSRF w swojej witrynie

Chociaż Django to umożliwia, wyłączenie wbudowanego mechanizmu ochrony CSRF Django nie jest zalecane. W ten sposób Twoja witryna będzie podatna na ataki CSRF i ostatecznie wpłynie negatywnie na użytkowników Twojej aplikacji.

Jeśli nie jesteś doświadczonym programistą, który wie, jak zaimplementować niestandardowy mechanizm ochrony CSRF, powinieneś pracować z alternatywą dostarczoną przez Django.