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ásdefte_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.