Protejați-vă site-ul web de o gaură de securitate foarte comună cu gestionarea CSRF încorporată de Django.

Django este un cadru web Python pe care îl puteți folosi pentru a crea aplicații web sigure. Oferă multe funcții pentru a ajuta dezvoltatorii cu securitatea. Una dintre aceste caracteristici sunt jetoanele CSRF, esențiale în protejarea formularelor împotriva atacurilor de falsificare a cererilor între site-uri.

Ce este un token CSRF?

Un token CSRF este o caracteristică de securitate care protejează aplicațiile web de Atacurile de falsificare a cererilor între site-uri (CSRF).. Permite serverului de aplicații să verifice dacă o trimitere a formularului a venit dintr-un browser autentic sau dacă un hacker a falsificat-o.

Tokenurile CSRF sunt intrări de formular care țin evidența unei sesiuni de utilizator. Un site web cadru de aplicații web pe partea de server generează de obicei jetoane CSRF pentru fiecare sesiune unică de utilizator. Serverul verifică dacă simbolul este corect ori de câte ori un utilizator trimite un formular. Jetoanele CSRF constau în general din șiruri și numere aleatorii, ceea ce face ca valorile lor să fie imprevizibile.

instagram viewer

Generarea de jetoane CSRF în Django

a lui Django get_token() funcția generează aleatoriu jetoane CSRF. Pentru a găsi această funcție, navigați la csrf.py fișier în interiorul dvs Mediul virtual Python. Structura folderului ar trebui să arate astfel:

env/

└── Lib/

└── site-pachete/

└── django/

└── middleware/

└── csrf.py

În acest fișier, veți găsi get_token() funcția, care returnează jetonul. Django folosește mascarea datelor pentru a proteja valoarea jetonului de hackeri.

În mod implicit, Django activează protecția CSRF pentru site-ul dvs. prin adăugare django.middleware.csrf. CsrfViewMiddleware în PRODUSE MEDIE lista dvs setări.py fişier. Tot ce trebuie să faci este să adaugi {% csrf_token %} pentru dumneavoastră POST forme. Fără a adăuga {% csrf_token %}, vei primi un 403 Interzis) eroare când trimiteți un formular.

Când adaugi {% csrf_token %} în formularul dvs., acesta creează automat un câmp de intrare ascuns cu numele csrfmiddlewaretoken, care conține valoarea jetonului CSRF mascat. Serverul folosește această valoare pentru a determina dacă trimiterea formularului este autentică. Puteți verifica valoarea acestui câmp ascuns vizualizând sursa paginii sau folosind funcția de instrumente pentru dezvoltatori a browserului dvs.

Cum funcționează jetoanele CSRF în Django

Când vă lansați site-ul cu formularul, Django creează automat un cookie de browser numit csrftoken. Acest cookie ține evidența activității utilizatorilor pe site și identifică în mod unic fiecare utilizator.

Când utilizatorul trimite formularul, serverul compară valoarea cookie-ului cu valoarea cookie-ului csrfmiddlewaretoken în câmpul de introducere ascuns. Dacă aceste valori se potrivesc, serverul va procesa formularul cu succes, altfel va produce o eroare.

La prima vedere, valorile cookie-ului și ale csrfmiddlewaretoken par a fi diferit. Acest lucru este intenționat și adaugă un strat suplimentar de protecție jetonului CSRF. Indicatorul CSRF este comparat cu cookie-ul astfel:

  • The get_token() funcția maschează jetonul CSRF înainte de a-l transmite în câmpul de intrare.
  • Când se trimite formularul, jetonul CSRF este demascat cu ajutorul cheii secrete din fișierul de setări.
  • Tokenul demascat este comparat cu cookie-ul de sesiune.
  • Dacă valorile sunt aceleași, formularul este procesat. Dacă nu, serverul returnează o eroare.

Pentru a împiedica hackerii să vă fure jetonul CSRF, Django îl reînnoiește de fiecare dată când începe o sesiune de utilizator.

Crearea de jetoane CSRF personalizate

Deși Django vă ajută să vă protejați formularele prin simpla adăugare a {% csrf_token %}, este de asemenea posibilă generarea de jetoane CSRF și adăugarea manuală a acestora la formularele dvs. Pentru a face acest lucru, importați get_token() funcţie:

din django.middleware.csrf import get_token

În opinia dvs., puteți genera simbolul CSRF astfel:

defview_name(cerere):
csrf_token = get_token (cerere)

# efectuează logica vizualizării
context = {
„csrf_token”: csrf_token
}

întoarcere randa (cerere, „nume_aplicație/template.html”, context=context)

În șablonul HTML, puteți include manual eticheta de intrare și adăugați csrf_token la el asa:

<formămetodă="POST" >
<intraretip="ascuns"Nume=„csrfmiddlewaretoken”valoare=„{{ csrf_token }}”>
{{form.as_p}}
<butontip="Trimite"clasă=„btn btn-outline-secundar”>Adaugă cartebuton>
formă>

Alternativ, puteți genera câmpul de intrare ascuns din vizualizările dvs. astfel:

defPunctul tău de vedere(cerere):
csrf_token = get_token (cerere)
csrf_token_html = ''.format (csrf_token)

# efectuează logica vizualizării
context = {
„csrf_token”: csrf_token_html
}

întoarcere randa (cerere, „nume_aplicație/template.html”, context=context)

Apoi îl puteți adăuga la șablonul HTML astfel:

<formămetodă="POST" >
{{ csrf_token_html|sigur }}
{{form.as_p}}
<butontip="Trimite"clasă=„btn btn-outline-secundar”>Adaugă cartebuton>
formă>

Dacă doriți să controlați complet protecția CSRF a formularului dvs., puteți face acest lucru comparând simbolul CSRF cu cookie-ul stocat în browser. Pe baza rezultatelor comparației, puteți gestiona trimiterea formularului așa cum doriți. Iată un exemplu:

din django.comenzi rapide import face
din django.middleware.csrf import get_token, _unmask_cipher_token
din django.utils.crypto import constant_time_compare

defPunctul tău de vedere(cerere):
# Generați un token CSRF personalizat
csrf_token = get_token (cerere)
csrf_cookie = cerere. COOKIES.get(„csrftoken”)

# demască simbolul csrf
unmasked_csrf_token = _unmask_cipher_token (csrf_token)

# Comparați jetoanele
dacănu constant_time_compare (unmasked_csrf_token, csrf_cookie):
# Gestionați cazul în care jetoanele nu se potrivesc
trece
altfel:
# Gestionați cazul în care jetoanele se potrivesc
trece

# Redați șablonul
context = {
„csrf_token”: csrf_token,
}

întoarcere randa (cerere, „nume_aplicație/template.html”, context=context)

Acest fragment de cod preia fișierul csrf_cookie din obiectul de solicitare HTTP. Apoi folosește _unmask_cipher_token() funcția de demascare a csrf_token.

O instrucțiune condiționată compară valorile extras csrf_cookie iar cei demascati csrf_token. Această comparație folosește constant_time_compare funcția de protecție împotriva exploatărilor de sincronizare. Vă puteți scrie logica pe baza rezultatului comparației.

Dezactivarea protecției CSRF în Django

Chiar dacă Django prevede o prevedere implicită pentru protecția CSRF, o puteți dezactiva în proiectul dvs. dacă doriți. Există două moduri de a face acest lucru:

  • Dezactivarea protecției CSRF pe întregul site web.
  • Dezactivarea protecției CSRF pe o anumită vizualizare.

Dezactivarea protecției CSRF pe întregul site web

Pentru a dezactiva protecția CSRF a Django pe site-ul dvs., trebuie pur și simplu să eliminați middleware-ul CSRF din fișierul de setări. În fișierul de setări, găsiți o listă numită PRODUSE MEDIE. În interiorul listei, căutați asta:

„django.middleware.csrf. CsrfViewMiddleware',

Odată ce îl găsiți, ar trebui să îl eliminați din cod pentru protecția implicită CSRF a Django pentru a o dezactiva.

Dezactivarea protecției CSRF pe o anumită vizualizare

Dacă doriți să dezactivați protecția CSRF doar pentru o anumită vizualizare Django, utilizați @csrf_exempt decorator. Iată un fragment de cod pentru a demonstra:

din django.views.decorators.csrf import csrf_exempt

@csrf_exempt
defview_name(cerere):
# efectuează logica vizualizării
trece

The @csrf_exempt decorator este doar unul dintre câteva legate de protecția CSRF în Django. Puteți citi despre restul pe Referința CSRF a lui Django.

Nu dezactivați protecția CSRF pe site-ul dvs. web

Deși Django face posibil acest lucru, dezactivarea mecanismului de protecție CSRF încorporat al Django nu este recomandată. Procedând astfel, site-ul dvs. va face vulnerabil la atacurile CSRF și, în cele din urmă, va afecta negativ utilizatorii aplicației dvs.

Cu excepția cazului în care sunteți un dezvoltator cu experiență care știe cum să implementeze un mecanism personalizat de protecție CSRF, ar trebui să lucrați cu alternativa oferită de Django.