Védje meg webhelyét egy nagyon gyakori biztonsági réssel szemben a Django beépített CSRF-kezelésével.

A Django egy Python webes keretrendszer, amellyel biztonságos webalkalmazásokat készíthet. Számos funkciót kínál a fejlesztők biztonságának elősegítésére. Az egyik ilyen funkció a CSRF tokenek, amelyek nélkülözhetetlenek az űrlapoknak a Cross-Site Request Forgery támadásokkal szembeni védelmében.

Mi az a CSRF token?

A CSRF-token egy biztonsági funkció, amely megvédi a webalkalmazásokat Cross-Site Request Forgery (CSRF) támadások. Lehetővé teszi az alkalmazásszerver számára, hogy ellenőrizze, hogy az űrlap beküldése hiteles böngészőből érkezett-e, vagy hacker hamisította azt.

A CSRF tokenek olyan űrlapbemenetek, amelyek nyomon követik a felhasználói munkamenetet. Egy weboldal szerveroldali webalkalmazás-keretrendszer jellemzően CSRF tokeneket generál minden egyedi felhasználói munkamenethez. A szerver minden alkalommal ellenőrzi, hogy a token helyes-e, amikor egy felhasználó elküld egy űrlapot. A CSRF tokenek általában véletlenszerű karakterláncokból és számokból állnak, így értékeik megjósolhatatlanok.

CSRF tokengenerálás a Django-ban

Django-é get_token() függvény véletlenszerűen generál CSRF tokeneket. A funkció megtalálásához navigáljon a csrf.py fájl a saját belsejében Python virtuális környezet. A mappaszerkezetnek így kell kinéznie:

env/

└── Lib/

└── site-csomagok/

└── django/

└── köztes szoftver/

└── csrf.py

Ebben a fájlban megtalálja a get_token() függvény, amely visszaadja a tokent. Django használ adatmaszkolás hogy megvédje a token értékét a hackerektől.

Alapértelmezés szerint a Django hozzáadásával engedélyezi a CSRF-védelmet webhelye számára django.middleware.csrf. CsrfViewMiddleware ban,-ben KÖZÉPVER listája a te settings.py fájlt. Mindössze annyit kell tennie, hogy hozzáadja {% csrf_token %} a tiédhez POST formák. Hozzáadás nélkül {% csrf_token %}, kapsz a 403 letiltva) hiba az űrlap elküldésekor.

Amikor hozzáteszed {% csrf_token %} az űrlaphoz, automatikusan létrehoz egy rejtett beviteli mezőt a névvel csrfmiddlewaretoken, amely a maszkolt CSRF token értékét tartalmazza. A szerver ezt az értéket használja annak meghatározására, hogy az űrlap elküldése hiteles-e. Ennek a rejtett mezőnek az értékét az oldal forrásának megtekintésével vagy a böngésző fejlesztői eszközeinek használatával ellenőrizheti.

Hogyan működnek a CSRF tokenek a Djangoban

Amikor elindítja webhelyét az űrlappal, a Django automatikusan létrehoz egy böngésző cookie hívott csrftoken. Ez a süti nyomon követi a felhasználói tevékenységet az oldalon, és minden felhasználót egyedileg azonosít.

Amikor a felhasználó elküldi az űrlapot, a szerver összehasonlítja a cookie értékét a cookie értékével csrfmiddlewaretoken a rejtett beviteli mezőben. Ha ezek az értékek megegyeznek, a szerver sikeresen feldolgozza az űrlapot, ellenkező esetben hibát fog kiadni.

Első ránézésre a süti értékei és a csrfmiddlewaretoken másnak tűnnek. Ez szándékos, és egy további védelmi réteget ad a CSRF tokenhez. A CSRF tokent a következőképpen hasonlítjuk össze a cookie-val:

  • A get_token() függvény maszkolja a CSRF tokent, mielőtt továbbadná a beviteli mezőnek.
  • Az űrlap elküldésekor a CSRF token maszkolásra kerül a beállítási fájl titkos kulcsának segítségével.
  • A nem maszkolt tokent összehasonlítja a munkamenet cookie-jával.
  • Ha az értékek megegyeznek, az űrlap feldolgozásra kerül. Ha nem, a szerver hibát ad vissza.

Annak megakadályozása érdekében, hogy a hackerek ellopják a CSRF tokenjét, a Django megújítja azt minden alkalommal, amikor egy felhasználói munkamenetet indít.

Egyéni CSRF tokenek létrehozása

Bár a Django megkönnyíti az űrlapok védelmét azáltal, hogy egyszerűen hozzáadja a {% csrf_token %}CSRF tokenek generálása és az űrlapokhoz való manuális hozzáadása is lehetséges. Ehhez importálja a get_token() funkció:

tól től django.middleware.csrf import get_token

Véleménye szerint a CSRF tokent a következőképpen állíthatja elő:

defview_name(kérés):
csrf_token = get_token (kérés)

# végrehajtani a nézet logikáját
kontextus = {
"csrf_token": csrf_token
}

Visszatérés render (kérés, "app_name/template.html", kontextus=kontextus)

A HTML-sablonba manuálisan is beillesztheti a beviteli címkét, és hozzáadhatja a csrf_token hozzá így:

<formamódszer="POST" >
<bemenettípus="rejtett"név="csrfmiddlewaretoken"érték="{{ csrf_token }}">
{{form.as_p}}
<gombtípus="Beküldés"osztály="btn btn-outline-secondary">Könyv hozzáadása elemregomb>
forma>

Alternatív megoldásként létrehozhatja a rejtett beviteli mezőt a nézeteiből az alábbiak szerint:

defte_nézeted(kérés):
csrf_token = get_token (kérés)
csrf_token_html = ''.formátum (csrf_token)

# végrehajtani a nézet logikáját
kontextus = {
"csrf_token": csrf_token_html
}

Visszatérés render (kérés, "app_name/template.html", kontextus=kontextus)

Ezután a következőképpen adhatja hozzá a HTML-sablonhoz:

<formamódszer="POST" >
{{ csrf_token_html|biztonságos }}
{{form.as_p}}
<gombtípus="Beküldés"osztály="btn btn-outline-secondary">Könyv hozzáadása elemregomb>
forma>

Ha teljes mértékben szeretné szabályozni űrlapja CSRF védelmét, ezt úgy teheti meg, hogy összehasonlítja CSRF tokenjét a böngészőben tárolt cookie-val. Az összehasonlítás eredménye alapján úgy kezelheti az űrlap beküldését, ahogy akarja. Íme egy példa:

tól től django.parancsikonok import Vakol
tól től django.middleware.csrf import get_token, _unmask_cipher_token
tól től django.utils.crypto import állandó_idő_összehasonlítás

defte_nézeted(kérés):
# Egyéni CSRF tokent generál
csrf_token = get_token (kérés)
csrf_cookie = kérés. COOKIES.get('csrftoken')

# csrf token feloldása
unmasked_csrf_token = _unmask_cipher_token (csrf_token)

# Hasonlítsa össze a tokeneket
hanem permanent_time_compare (unmasked_csrf_token, csrf_cookie):
# Kezelje azt az esetet, amikor a tokenek nem egyeznek
pass
más:
# Kezelje azt az esetet, amikor a tokenek egyeznek
pass

# Renderje le a sablont
kontextus = {
"csrf_token": csrf_token,
}

Visszatérés render (kérés, "app_name/template.html", kontextus=kontextus)

Ez a kódrészlet lekéri a csrf_cookie a HTTP kérés objektumból. Ezután a _unmask_cipher_token() funkciót a csrf_token.

Egy feltételes utasítás összehasonlítja a lekérdezett értékeket csrf_cookie és a leleplezett csrf_token. Ez az összehasonlítás a állandó_idő_összehasonlítás Az időzítés elleni védelem funkciója. Az összehasonlítás eredménye alapján megírhatja a logikáját.

A CSRF-védelem letiltása a Django-ban

Annak ellenére, hogy a Django rendelkezik alapértelmezett CSRF-védelemmel, letilthatja azt a projektben, ha akarja. Ennek két módja van:

  • A CSRF-védelem letiltása a teljes webhelyen.
  • A CSRF-védelem letiltása egy adott nézetben.

A CSRF-védelem letiltása a teljes webhelyen

A Django CSRF védelmének letiltásához a webhelyen egyszerűen el kell távolítania a CSRF köztes szoftvert a beállítási fájlból. A beállítási fájlban keresse meg a következő listát KÖZÉPVER. A listában keressen erre:

'django.middleware.csrf. CsrfViewMiddleware,

Ha megtalálta, távolítsa el a kódból a Django alapértelmezett CSRF-védelmének letiltásához.

A CSRF-védelem letiltása egy adott nézetben

Ha csak egy adott Django nézetben szeretné letiltani a CSRF védelmet, használja a @csrf_mentes lakberendező. Íme egy kódrészlet a bemutatásra:

tól től django.views.decorators.csrf import csrf_mentes

@csrf_mentes
defview_name(kérés):
# végrehajtani a nézet logikáját
pass

A @csrf_mentes A dekorátor csak egy a Django CSRF-védelemmel kapcsolatos számos közül. A többiről itt olvashatsz Django CSRF hivatkozása.

Ne tiltsa le a CSRF védelmet a webhelyén

Bár a Django lehetővé teszi, a Django beépített CSRF védelmi mechanizmusának letiltása nem ajánlott. Ha így tesz, webhelye sebezhetővé válik a CSRF-támadásokkal szemben, és végső soron negatívan érinti az alkalmazás felhasználóit.

Hacsak nem egy tapasztalt fejlesztő, aki tudja, hogyan kell egyéni CSRF védelmi mechanizmust megvalósítani, akkor a Django által biztosított alternatívával kell dolgoznia.