Zaščitite svoje spletno mesto pred zelo pogosto varnostno luknjo z Djangovo vgrajeno obdelavo CSRF.
Django je spletno ogrodje Python, ki ga lahko uporabite za izdelavo varnih spletnih aplikacij. Ponuja številne funkcije za pomoč razvijalcem pri varnosti. Ena od teh funkcij so žetoni CSRF, ki so bistveni za zaščito obrazcev pred napadi ponarejanja zahtev med spletnimi mesti.
Kaj je žeton CSRF?
Žeton CSRF je varnostna funkcija, ki ščiti spletne aplikacije pred Napadi s ponarejanjem zahtev na različnih mestih (CSRF).. Aplikacijskemu strežniku omogoča, da preveri, ali je predložitev obrazca prišla iz pristnega brskalnika ali pa jo je heker ponaredil.
Žetoni CSRF so vnosi obrazcev, ki spremljajo uporabniško sejo. Spletna stran ogrodje spletne aplikacije na strani strežnika običajno ustvari žetone CSRF za vsako edinstveno uporabniško sejo. Strežnik preveri, ali je žeton pravilen, kadar koli uporabnik odda obrazec. Žetoni CSRF so običajno sestavljeni iz naključnih nizov in števil, zaradi česar so njihove vrednosti nepredvidljive.
Generiranje žetonov CSRF v Djangu
Djangov get_token() funkcija naključno ustvari žetone CSRF. Če želite najti to funkcijo, se pomaknite do csrf.py datoteko v vašem Virtualno okolje Python. Struktura mape bi morala izgledati takole:
env/
└── Lib/
└── paketi spletnih mest/
└── django/
└── vmesna programska oprema/
└── csrf.py
V tej datoteki boste našli get_token() funkcijo, ki vrne žeton. Django uporablja maskiranje podatkov za zaščito vrednosti žetona pred hekerji.
Django privzeto omogoči zaščito CSRF za vaše spletno mesto z dodajanjem django.middleware.csrf. CsrfViewMiddleware v VREDNA OPREMA seznam vaših nastavitve.py mapa. Vse, kar morate storiti, je dodati {% csrf_token %} na vašo OBJAVI obrazci. Brez dodajanja {% csrf_token %}, boste dobili a 403 Prepovedano) napaka, ko oddate obrazec.
Ko dodate {% csrf_token %} v vaš obrazec samodejno ustvari skrito vnosno polje z imenom csrfmiddlewaretoken, ki vsebuje vrednost maskiranega žetona CSRF. Strežnik uporablja to vrednost, da ugotovi, ali je predložitev obrazca pristna. Vrednost tega skritega polja lahko preverite tako, da si ogledate vir strani ali uporabite funkcijo orodij za razvijalce svojega brskalnika.
Kako žetoni CSRF delujejo v Djangu
Ko zaženete svoje spletno mesto z obrazcem, Django samodejno ustvari a piškotek brskalnika klical csrftoken. Ta piškotek spremlja aktivnost uporabnikov na spletnem mestu in enolično identificira vsakega uporabnika.
Ko uporabnik odda obrazec, strežnik primerja vrednost piškotka z vrednostjo csrfmiddlewaretoken v skritem vnosnem polju. Če se te vrednosti ujemajo, bo strežnik uspešno obdelal obrazec, sicer bo povzročil napako.
Na prvi pogled vrednosti piškotka in csrfmiddlewaretoken se zdijo drugačni. To je namerno in žetonu CSRF doda dodatno raven zaščite. Žeton CSRF se primerja s piškotkom takole:
- The get_token() funkcija maskira žeton CSRF, preden ga posreduje v polje za vnos.
- Ko je obrazec oddan, se žeton CSRF razkrije s pomočjo tajnega ključa v datoteki z nastavitvami.
- Razkriti žeton se primerja s piškotkom seje.
- Če so vrednosti enake, se obrazec obdela. Če ne, strežnik vrne napako.
Da hekerjem prepreči krajo vašega žetona CSRF, ga Django obnovi vsakič, ko začne uporabniško sejo.
Ustvarjanje žetonov CSRF po meri
Čeprav Django olajša zaščito vaših obrazcev s preprostim dodajanjem {% csrf_token %}, možno je tudi ustvarjanje žetonov CSRF in njihovo ročno dodajanje v vaše obrazce. Če želite to narediti, uvozite get_token() funkcija:
od django.middleware.csrf uvoz get_token
Po vašem mnenju lahko žeton CSRF ustvarite takole:
defime_pogleda(prošnja):
csrf_token = get_token (zahteva)# izvedite logiko pogleda
kontekst = {
"csrf_token": csrf_token
}
vrnitev render (zahteva, 'ime_aplikacije/predloga.html', kontekst=kontekst)
V svojo predlogo HTML lahko ročno vključite svojo vnosno oznako in dodate csrf_token temu takole:
<oblikametoda="POST" >
<vnosvrsta="skrit"ime="csrfmiddlewaretoken"vrednost="{{ csrf_token }}">
{{form.as_p}}
<gumbvrsta="oddaj"razred="btn btn-outline-secondary">Dodaj knjigogumb>
oblika>
Druga možnost je, da ustvarite skrito vnosno polje iz svojih pogledov, takole:
deftvoj_pogled(prošnja):
csrf_token = get_token (zahteva)
csrf_token_html = ''.format (csrf_token)# izvedite logiko pogleda
kontekst = {
"csrf_token": csrf_token_html
}
vrnitev render (zahteva, 'ime_aplikacije/predloga.html', kontekst=kontekst)
Nato ga lahko dodate svoji predlogi HTML tako:
<oblikametoda="POST" >
{{ csrf_token_html|varno }}
{{form.as_p}}
<gumbvrsta="oddaj"razred="btn btn-outline-secondary">Dodaj knjigogumb>
oblika>
Če želite popolnoma nadzorovati zaščito CSRF obrazca, lahko to storite tako, da svoj žeton CSRF primerjate s piškotkom, shranjenim v brskalniku. Na podlagi rezultatov primerjave lahko obdelate oddajo obrazca, kakor želite. Tukaj je primer:
od django.shortcuts uvoz upodabljati
od django.middleware.csrf uvoz get_token, _unmask_cipher_token
od django.utils.crypto uvoz konstantni_čas_primerjavadeftvoj_pogled(prošnja):
# Ustvarite žeton CSRF po meri
csrf_token = get_token (zahteva)
csrf_cookie = zahteva. COOKIES.get('csrftoken')# razkrij žeton csrf
unmasked_csrf_token = _unmask_cipher_token (csrf_token)
# Primerjajte žetone
čene konstantna_časovna_primerjava (unmasked_csrf_token, csrf_cookie):
# Obravnavajte primer, ko se žetoni ne ujemajo
prehod
drugače:
# Obravnavajte primer, ko se žetoni ujemajo
prehod
# Upodobite predlogo
kontekst = {
'csrf_token': csrf_token,
}
vrnitev render (zahteva, 'ime_aplikacije/predloga.html', kontekst=kontekst)
Ta delček kode pridobi csrf_piškotek iz objekta zahteve HTTP. Nato uporabi _unmask_cipher_token() funkcijo za razkritje csrf_token.
Pogojni stavek primerja vrednosti pridobljenega csrf_piškotek in razkrinkanih csrf_token. Ta primerjava uporablja konstantni_čas_primerjava funkcijo za zaščito pred izkoriščanjem časa. Na podlagi rezultata primerjave lahko zapišete svojo logiko.
Onemogočanje zaščite CSRF v Djangu
Čeprav ima Django privzeto možnost za zaščito CSRF, jo lahko onemogočite v svojem projektu, če želite. To lahko storite na dva načina:
- Onemogočanje zaščite CSRF na celotnem spletnem mestu.
- Onemogočanje zaščite CSRF na določenem pogledu.
Onemogočanje zaščite CSRF na vašem celotnem spletnem mestu
Če želite onemogočiti Djangovo zaščito CSRF na vašem spletnem mestu, morate preprosto odstraniti vmesno programsko opremo CSRF iz svoje nastavitvene datoteke. V datoteki z nastavitvami poiščite seznam z imenom VREDNA OPREMA. Znotraj seznama poiščite to:
'django.middleware.csrf. CsrfViewMiddleware',
Ko ga najdete, ga morate odstraniti iz svoje kode za Djangovo privzeto zaščito CSRF, da jo onemogočite.
Onemogočanje zaščite CSRF v določenem pogledu
Če želite onemogočiti samo zaščito CSRF na določenem pogledu Django, uporabite @csrf_izjema dekorater. Tukaj je delček kode za predstavitev:
od django.views.decorators.csrf uvoz csrf_exempt
@csrf_izjema
defime_pogleda(prošnja):
# izvedite logiko pogleda
prehod
The @csrf_izjema dekorater je le eden izmed več povezanih z zaščito CSRF v Djangu. O ostalem si lahko preberete na Djangova referenca CSRF.
Ne onemogočite zaščite CSRF na svojem spletnem mestu
Čeprav Django to omogoča, onemogočanje Djangovega vgrajenega zaščitnega mehanizma CSRF ni priporočljivo. S tem bo vaše spletno mesto postalo ranljivo za napade CSRF in na koncu negativno vplivalo na uporabnike vaše aplikacije.
Razen če ste izkušen razvijalec, ki ve, kako implementirati zaščitni mehanizem CSRF po meri, bi morali delati z alternativo, ki jo ponuja Django.