Chraňte svůj web před velmi běžnou bezpečnostní dírou pomocí vestavěného zpracování CSRF společnosti Django.
Django je webový rámec Pythonu, který můžete použít k vytváření bezpečných webových aplikací. Nabízí mnoho funkcí, které vývojářům pomohou se zabezpečením. Jednou z těchto funkcí jsou tokeny CSRF, nezbytné pro ochranu formulářů před útoky typu Cross-Site Request Forgery.
Co je token CSRF?
CSRF token je bezpečnostní funkce, která chrání webové aplikace před Cross-Site Request Forgery (CSRF) útoky. Umožňuje aplikačnímu serveru zkontrolovat, zda odeslání formuláře pochází z autentického prohlížeče, nebo jej zfalšoval hacker.
CSRF tokeny jsou formulářové vstupy, které sledují relaci uživatele. Webová stránka framework webové aplikace na straně serveru obvykle generuje tokeny CSRF pro každou jedinečnou uživatelskou relaci. Server zkontroluje, zda je token správný, kdykoli uživatel odešle formulář. Tokeny CSRF se obecně skládají z náhodných řetězců a čísel, takže jejich hodnoty jsou nepředvídatelné.
Generování tokenů CSRF v Django
Django's get_token() funkce náhodně generuje tokeny CSRF. Chcete-li tuto funkci najít, přejděte na csrf.py soubor uvnitř vašeho Virtuální prostředí Python. Struktura složek by měla vypadat takto:
env/
└── Lib/
└── balíčky stránek/
└── django/
└── middleware/
└── csrf.py
Uvnitř tohoto souboru najdete get_token() funkce, která vrací token. Django používá maskování dat chránit hodnotu tokenu před hackery.
Ve výchozím nastavení Django umožňuje ochranu CSRF pro váš web přidáním django.middleware.csrf. CsrfViewMiddleware v STŘEDNÍ NÁSTROJ seznam vašich settings.py soubor. Vše, co musíte udělat, je přidat {% csrf_token %} tvému POŠTA formuláře. Bez přidání {% csrf_token %}, dostanete a 403 Přístup odepřen) chyba při odesílání formuláře.
Když přidáte {% csrf_token %} do vašeho formuláře automaticky vytvoří skryté vstupní pole s názvem csrfmiddlewaretoken, který obsahuje hodnotu maskovaného tokenu CSRF. Server používá tuto hodnotu k určení, zda je odeslání formuláře autentické. Hodnotu tohoto skrytého pole můžete zkontrolovat zobrazením zdroje stránky nebo pomocí funkce vývojářských nástrojů vašeho prohlížeče.
Jak CSRF tokeny fungují v Django
Když spustíte svůj web pomocí formuláře, Django automaticky vytvoří a cookie prohlížeče volal csrftoken. Tento soubor cookie sleduje aktivitu uživatelů na webu a jednoznačně identifikuje každého uživatele.
Když uživatel odešle formulář, server porovná hodnotu souboru cookie s hodnotou souboru csrfmiddlewaretoken ve skrytém vstupním poli. Pokud se tyto hodnoty shodují, server formulář úspěšně zpracuje, jinak dojde k chybě.
Na první pohled jsou hodnoty cookie a csrfmiddlewaretoken se zdají být jiné. Je to záměrné a přidává to do tokenu CSRF další vrstvu ochrany. Token CSRF se porovnává se souborem cookie takto:
- The get_token() funkce maskuje token CSRF před jeho předáním do vstupního pole.
- Když se formulář odešle, token CSRF se odmaskuje pomocí tajného klíče v souboru nastavení.
- Odmaskovaný token se porovná se souborem cookie relace.
- Pokud jsou hodnoty stejné, formulář se zpracuje. Pokud ne, server vrátí chybu.
Aby hackeři zabránili krádeži vašeho CSRF tokenu, Django jej obnoví pokaždé, když zahájí uživatelskou relaci.
Vytváření vlastních tokenů CSRF
Ačkoli Django usnadňuje ochranu vašich formulářů pouhým přidáním {% csrf_token %}, generování tokenů CSRF a jejich ruční přidávání do formulářů je také možné. Chcete-li to provést, importujte soubor get_token() funkce:
z django.middleware.csrf import get_token
Podle vašeho pohledu můžete token CSRF vygenerovat takto:
defnázev_zobrazení(žádost):
csrf_token = get_token (požadavek)# provést logiku zobrazení
kontext = {
"csrf_token": csrf_token
}
vrátit se vykreslit (žádost, 'název_aplikace/šablona.html', kontext=kontext)
Do šablony HTML můžete ručně zahrnout vstupní značku a přidat ji csrf_token k tomu takto:
<formulářmetoda="POŠTA" >
<vstuptyp="skrytý"název="csrfmiddlewaretoken"hodnota="{{ csrf_token }}">
{{form.as_p}}
<knoflíktyp="Předložit"třída="btn btn-outline-secondary">Přidat knihuknoflík>
formulář>
Případně můžete vygenerovat skryté vstupní pole ze svých pohledů takto:
defyour_view(žádost):
csrf_token = get_token (požadavek)
csrf_token_html = ''.format (csrf_token)# provést logiku zobrazení
kontext = {
"csrf_token": csrf_token_html
}
vrátit se vykreslit (žádost, 'název_aplikace/šablona.html', kontext=kontext)
Poté jej můžete přidat do šablony HTML takto:
<formulářmetoda="POŠTA" >
{{ csrf_token_html|bezpečné }}
{{form.as_p}}
<knoflíktyp="Předložit"třída="btn btn-outline-secondary">Přidat knihuknoflík>
formulář>
Chcete-li zcela ovládat ochranu CSRF vašeho formuláře, můžete to udělat porovnáním vašeho CSRF tokenu se souborem cookie uloženým v prohlížeči. Na základě výsledků porovnání můžete s odesláním formuláře naložit, jak chcete. Zde je příklad:
z django.zkratky import poskytnout
z django.middleware.csrf import get_token, _unmask_cipher_token
z django.utils.crypto import konstantní_čas_porovnánídefyour_view(žádost):
# Vygenerujte vlastní token CSRF
csrf_token = get_token (požadavek)
csrf_cookie = požadavek. COOKIES.get('csrftoken')# odmaskovat token csrf
unmasked_csrf_token = _unmask_cipher_token (csrf_token)
# Porovnejte žetony
-line Constant_time_compare (unmasked_csrf_token, csrf_cookie):
# Vyřešte případ, kdy se žetony neshodují
složit
jiný:
# Vyřešte případ, kdy se žetony shodují
složit
# Vykreslit šablonu
kontext = {
'csrf_token': csrf_token,
}
vrátit se vykreslit (žádost, 'název_aplikace/šablona.html', kontext=kontext)
Tento fragment kódu načte soubor csrf_cookie z objektu požadavku HTTP. Poté používá _unmask_cipher_token() funkce k odmaskování csrf_token.
Podmíněný příkaz porovnává hodnoty načtených csrf_cookie a odmaskovaní csrf_token. Toto srovnání používá konstantní_čas_porovnání funkce na ochranu před zneužitím časování. Na základě výsledku srovnání můžete napsat svou logiku.
Zakázání ochrany CSRF v Django
Přestože Django poskytuje ochranu CSRF jako výchozí, můžete ji ve svém projektu zakázat, pokud chcete. To lze provést dvěma způsoby:
- Deaktivace ochrany CSRF na celém vašem webu.
- Zakázání ochrany CSRF na konkrétním pohledu.
Deaktivace ochrany CSRF na celém vašem webu
Chcete-li deaktivovat ochranu CSRF společnosti Django na svém webu, musíte ze souboru nastavení jednoduše odebrat middleware CSRF. V souboru nastavení vyhledejte seznam s názvem STŘEDNÍ NÁSTROJ. V seznamu vyhledejte toto:
'django.middleware.csrf. CsrfViewMiddleware',
Jakmile ji najdete, měli byste ji odstranit ze svého kódu, aby ji zakázala výchozí ochrana CSRF společnosti Django.
Zakázání ochrany CSRF na konkrétním pohledu
Pokud chcete zakázat ochranu CSRF pouze v konkrétním zobrazení Django, použijte @csrf_exempt dekoratér. Zde je ukázka úryvku kódu:
z django.views.decorators.csrf import csrf_exempt
@csrf_exempt
defnázev_zobrazení(žádost):
# provést logiku zobrazení
složit
The @csrf_exempt decorator je jen jedním z několika souvisejících s ochranou CSRF v Django. O zbytku si můžete přečíst na Djangoův odkaz CSRF.
Nevypínejte ochranu CSRF na svém webu
Ačkoli to Django umožňuje, nedoporučuje se deaktivovat vestavěný ochranný mechanismus CSRF společnosti Django. Pokud tak učiníte, váš web bude zranitelný vůči útokům CSRF a v konečném důsledku to negativně ovlivní uživatele vaší aplikace.
Pokud nejste zkušený vývojář, který ví, jak implementovat vlastní mechanismus ochrany CSRF, měli byste pracovat s alternativou, kterou poskytuje Django.