Chráňte svoj web pred veľmi častou bezpečnostnou dierou pomocou vstavaného spracovania CSRF spoločnosti Django.

Django je webový rámec Pythonu, ktorý môžete použiť na vytváranie bezpečných webových aplikácií. Ponúka mnoho funkcií, ktoré vývojárom pomôžu so zabezpečením. Jednou z týchto funkcií sú tokeny CSRF, ktoré sú nevyhnutné na ochranu formulárov pred útokmi typu Cross-Site Request Forgery.

Čo je token CSRF?

Token CSRF je bezpečnostná funkcia, ktorá chráni webové aplikácie pred Cross-Site Request Forgery (CSRF) útoky. Umožňuje aplikačnému serveru skontrolovať, či odoslaný formulár pochádza z autentického prehliadača alebo ho sfalšoval hacker.

Tokeny CSRF sú vstupy formulárov, ktoré sledujú reláciu používateľa. Webová stránka rámec webových aplikácií na strane servera zvyčajne generuje tokeny CSRF pre každú jedinečnú reláciu používateľa. Server skontroluje, či je token správny vždy, keď používateľ odošle formulár. Tokeny CSRF vo všeobecnosti pozostávajú z náhodných reťazcov a čísel, vďaka čomu sú ich hodnoty nepredvídateľné.

instagram viewer

Generovanie tokenov CSRF v Django

Django's get_token() funkcia náhodne generuje tokeny CSRF. Ak chcete nájsť túto funkciu, prejdite na csrf.py súbor vo vašom Virtuálne prostredie Python. Štruktúra priečinkov by mala vyzerať takto:

env/

└── Lib/

└── balíčky stránok/

└── django/

└── middleware/

└── csrf.py

Vo vnútri tohto súboru nájdete súbor get_token() funkcia, ktorá vráti token. Django používa maskovanie údajov na ochranu hodnoty tokenu pred hackermi.

V predvolenom nastavení Django povoľuje ochranu CSRF pre vaše stránky pridaním django.middleware.csrf. CsrfViewMiddleware v MEDLEWARE zoznam vašich settings.py súbor. Všetko, čo musíte urobiť, je pridať {% csrf_token %} tvojmu POST formulárov. Bez pridania {% csrf_token %}, dostanete a 403 zakázané) chyba pri odosielaní formulára.

Keď pridáte {% csrf_token %} do vášho formulára automaticky vytvorí skryté vstupné pole s názvom csrfmiddlewaretoken, ktorý obsahuje hodnotu maskovaného tokenu CSRF. Server používa túto hodnotu na určenie, či je odoslanie formulára autentické. Hodnotu tohto skrytého poľa môžete skontrolovať zobrazením zdroja stránky alebo pomocou funkcie vývojárskych nástrojov vášho prehliadača.

Ako fungujú tokeny CSRF v Django

Keď spustíte svoju stránku pomocou formulára, Django automaticky vytvorí a cookie prehliadača volal csrftoken. Tento súbor cookie sleduje aktivitu používateľov na stránke a jedinečne identifikuje každého používateľa.

Keď používateľ odošle formulár, server porovná hodnotu súboru cookie s hodnotou súboru cookie csrfmiddlewaretoken v skrytom vstupnom poli. Ak sa tieto hodnoty zhodujú, server formulár úspešne spracuje, inak vygeneruje chybu.

Na prvý pohľad sú hodnoty súboru cookie a csrfmiddlewaretoken sa zdajú byť odlišné. Je to zámerné a pridáva to k tokenu CSRF ďalšiu vrstvu ochrany. Token CSRF sa porovnáva so súborom cookie takto:

  • The get_token() funkcia maskuje token CSRF pred jeho odovzdaním do vstupného poľa.
  • Keď sa formulár odošle, token CSRF sa demaskuje pomocou tajného kľúča v súbore nastavení.
  • Odmaskovaný token sa porovná so súborom cookie relácie.
  • Ak sú hodnoty rovnaké, formulár sa spracuje. Ak nie, server vráti chybu.

Aby sa zabránilo hackerom ukradnúť váš token CSRF, Django ho obnoví vždy, keď spustí reláciu používateľa.

Vytváranie vlastných tokenov CSRF

Hoci Django uľahčuje ochranu vašich formulárov jednoduchým pridaním {% csrf_token %}, generovanie tokenov CSRF a ich manuálne pridávanie do formulárov je tiež možné. Ak to chcete urobiť, importujte súbor get_token() funkcia:

od django.middleware.csrf importovať get_token

Podľa vášho názoru môžete token CSRF vygenerovať takto:

defview_name(žiadosť):
csrf_token = get_token (požiadavka)

# vykonávať logiku zobrazenia
kontext = {
"csrf_token": csrf_token
}

vrátiť vykresliť (žiadosť, 'app_name/template.html', kontext=kontext)

Do šablóny HTML môžete manuálne zahrnúť vstupnú značku a pridať značku csrf_token k tomu takto:

<formulármetóda="POST" >
<vstuptypu="skrytý"názov="csrfmiddlewaretoken"hodnotu="{{ csrf_token }}">
{{form.as_p}}
<tlačidlotypu="Predložiť"trieda="btn btn-outline-secondary">Pridať knihutlačidlo>
formulár>

Prípadne môžete vygenerovať skryté vstupné pole z vašich zobrazení takto:

deftvoj_pohlad(žiadosť):
csrf_token = get_token (požiadavka)
csrf_token_html = ''.format (csrf_token)

# vykonávať logiku zobrazenia
kontext = {
"csrf_token": csrf_token_html
}

vrátiť vykresliť (žiadosť, 'app_name/template.html', kontext=kontext)

Potom ho môžete pridať do svojej šablóny HTML takto:

<formulármetóda="POST" >
{{ csrf_token_html|safe }}
{{form.as_p}}
<tlačidlotypu="Predložiť"trieda="btn btn-outline-secondary">Pridať knihutlačidlo>
formulár>

Ak chcete úplne kontrolovať ochranu CSRF vášho formulára, môžete to urobiť porovnaním vášho tokenu CSRF so súborom cookie uloženým v prehliadači. Na základe výsledkov porovnania môžete s odoslaním formulára naložiť akokoľvek chcete. Tu je príklad:

od django.skratky importovať vykresliť
od django.middleware.csrf importovať get_token, _unmask_cipher_token
od django.utils.crypto importovať konštantný_čas_porovnanie

deftvoj_pohlad(žiadosť):
# Vytvorte si vlastný token CSRF
csrf_token = get_token (požiadavka)
csrf_cookie = požiadavka. COOKIES.get('csrftoken')

# demaskovať token csrf
unmasked_csrf_token = _unmask_cipher_token (csrf_token)

# Porovnajte žetóny
aknie Constant_time_compare (unmasked_csrf_token, csrf_cookie):
# Vyriešte prípad, keď sa žetóny nezhodujú
prejsť
inak:
# Vyriešte prípad, keď sa žetóny zhodujú
prejsť

# Vykreslite šablónu
kontext = {
'csrf_token': csrf_token,
}

vrátiť vykresliť (žiadosť, 'app_name/template.html', kontext=kontext)

Tento útržok kódu načíta csrf_cookie z objektu požiadavky HTTP. Potom použije _unmask_cipher_token() funkcia na demaskovanie csrf_token.

Podmienený príkaz porovnáva hodnoty obnoveného csrf_cookie a demaskovaní csrf_token. Toto porovnanie používa konštantný_čas_porovnanie funkcia na ochranu pred zneužitím načasovania. Svoju logiku môžete napísať na základe výsledku porovnania.

Zakázanie ochrany CSRF v Django

Aj keď Django predvolene poskytuje ochranu CSRF, môžete ju vo svojom projekte zakázať, ak chcete. Existujú dva spôsoby, ako to urobiť:

  • Vypnutie ochrany CSRF na celom vašom webe.
  • Vypnutie ochrany CSRF v konkrétnom zobrazení.

Zakázanie ochrany CSRF na celej vašej webovej lokalite

Ak chcete na svojom webe zakázať ochranu CSRF spoločnosti Django, musíte zo súboru s nastaveniami jednoducho odstrániť middleware CSRF. V súbore nastavení nájdite zoznam s názvom MEDLEWARE. V zozname vyhľadajte toto:

'django.middleware.csrf. CsrfViewMiddleware',

Keď ho nájdete, mali by ste ho odstrániť zo svojho kódu, aby sa zakázala predvolená ochrana CSRF spoločnosti Django.

Vypnutie ochrany CSRF v konkrétnom zobrazení

Ak chcete vypnúť ochranu CSRF iba v konkrétnom zobrazení Django, použite @csrf_exempt dekoratér. Tu je útržok kódu na ukážku:

od django.views.decorators.csrf importovať csrf_exempt

@csrf_exempt
defview_name(žiadosť):
# vykonávať logiku zobrazenia
prejsť

The @csrf_exempt dekoratér je len jedným z niekoľkých súvisiacich s ochranou CSRF v Django. O zvyšku si môžete prečítať na Djangova referencia CSRF.

Nevypínajte ochranu CSRF na svojom webe

Aj keď to Django umožňuje, neodporúča sa deaktivovať vstavaný ochranný mechanizmus CSRF v Django. Ak tak urobíte, váš web bude zraniteľný voči útokom CSRF a v konečnom dôsledku to negatívne ovplyvní používateľov vašej aplikácie.

Ak nie ste skúsený vývojár, ktorý vie, ako implementovať vlastný mechanizmus ochrany CSRF, mali by ste pracovať s alternatívou, ktorú poskytuje Django.