Suojaa verkkosivustosi hyvin yleiseltä tietoturva-aukolta Djangon sisäänrakennetulla CSRF-käsittelyllä.

Django on Python-verkkokehys, jonka avulla voit rakentaa suojattuja verkkosovelluksia. Se tarjoaa monia ominaisuuksia, jotka auttavat kehittäjiä turvallisuuden kanssa. Yksi näistä ominaisuuksista on CSRF-tunnukset, jotka ovat välttämättömiä lomakkeiden suojaamisessa Cross-Site Request Forgery -hyökkäyksiltä.

Mikä on CSRF-tunnus?

CSRF-tunnus on suojausominaisuus, joka suojaa verkkosovelluksia vastaan Cross-Site Request Forgery (CSRF) -hyökkäykset. Sen avulla sovelluspalvelin voi tarkistaa, tuliko lomakelähetys autenttisesta selaimesta vai väärensikö hakkeri sen.

CSRF-tunnukset ovat lomakesyöttöjä, jotka seuraavat käyttäjän istuntoa. Verkkosivusto palvelinpuolen verkkosovelluskehys luo tyypillisesti CSRF-tunnisteita kullekin yksilölliselle käyttäjäistunnolle. Palvelin tarkistaa, onko tunnus oikea aina, kun käyttäjä lähettää lomakkeen. CSRF-tunnukset koostuvat yleensä satunnaisista merkkijonoista ja numeroista, mikä tekee niiden arvoista arvaamattomia.

CSRF Token Generation Djangossa

Djangon get_token() toiminto luo satunnaisesti CSRF-tunnuksia. Löytääksesi tämän toiminnon, siirry kohtaan csrf.py tiedosto sisälläsi Python-virtuaaliympäristö. Kansiorakenteen pitäisi näyttää tältä:

env/

└── Lib/

└── sivustopaketit/

└── django/

└── väliohjelmisto/

└── csrf.py

Tämän tiedoston sisältä löydät get_token() funktio, joka palauttaa tunnuksen. Django käyttää tietojen peittäminen suojatakseen tunnuksen arvoa hakkereilta.

Oletuksena Django ottaa CSRF-suojauksen käyttöön sivustollesi lisäämällä django.middleware.csrf. CsrfViewMiddleware in VÄLIOHJEET luettelo sinun settings.py tiedosto. Sinun tarvitsee vain lisätä {% csrf_token %} sinun LÄHETTÄÄ lomakkeita. Ilman lisäystä {% csrf_token %}, saat a 403 Ei sallittu) virhe, kun lähetät lomakkeen.

Kun lisäät {% csrf_token %} lomakkeellesi, se luo automaattisesti piilotetun syöttökentän nimellä csrfmiddlewaretoken, joka sisältää peitetyn CSRF-tunnuksen arvon. Palvelin määrittää tämän arvon avulla, onko lomakkeen lähetys aito. Voit tarkistaa tämän piilotetun kentän arvon katsomalla sivun lähdettä tai käyttämällä selaimesi kehittäjätyökalutoimintoa.

Kuinka CSRF-tunnukset toimivat Djangossa

Kun käynnistät sivustosi lomakkeella, Django luo automaattisesti a selaimen eväste nimeltään csrftoken. Tämä eväste seuraa käyttäjien toimintaa sivustolla ja tunnistaa jokaisen käyttäjän yksilöllisesti.

Kun käyttäjä lähettää lomakkeen, palvelin vertaa evästeen arvoa csrfmiddlewaretoken piilotetussa syöttökentässä. Jos nämä arvot täsmäävät, palvelin käsittelee lomakkeen onnistuneesti, muuten se tuottaa virheen.

Ensi silmäyksellä evästeen arvot ja csrfmiddlewaretoken näyttävät olevan erilaisia. Tämä on tarkoituksellista ja lisää ylimääräisen suojakerroksen CSRF-tunnukseen. CSRF-tunnusta verrataan evästeeseen seuraavasti:

  • The get_token() toiminto peittää CSRF-tunnuksen ennen sen välittämistä syöttökenttään.
  • Kun lomake lähetetään, CSRF-tunnus paljastetaan asetustiedoston salaisen avaimen avulla.
  • Naamioimatonta merkkiä verrataan istunnon evästeeseen.
  • Jos arvot ovat samat, lomake käsitellään. Jos ei, palvelin palauttaa virheilmoituksen.

Estääkseen hakkereita varastamasta CSRF-tunnustasi Django uusii sen aina, kun se aloittaa käyttäjäistunnon.

Mukautettujen CSRF-tunnusten luominen

Vaikka Django tekee lomakkeiden suojaamisesta helppoa lisäämällä {% csrf_token %}, on myös mahdollista luoda CSRF-tunnisteita ja lisätä niitä manuaalisesti lomakkeihisi. Voit tehdä tämän tuomalla get_token() toiminto:

alkaen django.middleware.csrf tuonti get_tonken

Voit mielestäsi luoda CSRF-tunnuksen seuraavasti:

defnäkymän_nimi(pyyntö):
csrf_token = get_token (pyyntö)

# suorita näkymälogiikka
konteksti = {
"csrf_token": csrf_token
}

palata renderöi (pyyntö, "sovelluksen_nimi/malli.html", konteksti=konteksti)

Voit lisätä syöttötunnisteen manuaalisesti HTML-malliisi ja lisätä sen csrf_token siihen näin:

<muodossamenetelmä="LÄHETTÄÄ" >
<syöttötyyppi="piilotettu"nimi="csrfmiddlewaretoken"arvo="{{ csrf_token }}">
{{form.as_p}}
<-painikettatyyppi="Lähetä"luokkaa="btn btn-outline-secondary">Lisää kirja-painiketta>
muodossa>

Vaihtoehtoisesti voit luoda piilotetun syöttökentän näkymistäsi seuraavasti:

defsinun_näkymäsi(pyyntö):
csrf_token = get_token (pyyntö)
csrf_token_html = ''.format (csrf_token)

# suorita näkymälogiikka
konteksti = {
"csrf_token": csrf_token_html
}

palata renderöi (pyyntö, "sovelluksen_nimi/malli.html", konteksti=konteksti)

Voit sitten lisätä sen HTML-malliisi seuraavasti:

<muodossamenetelmä="LÄHETTÄÄ" >
{{ csrf_token_html|turvallinen }}
{{form.as_p}}
<-painikettatyyppi="Lähetä"luokkaa="btn btn-outline-secondary">Lisää kirja-painiketta>
muodossa>

Jos haluat hallita täysin lomakkeesi CSRF-suojausta, voit tehdä sen vertaamalla CSRF-tunnustasi selaimeen tallennettuun evästeeseen. Vertailun tulosten perusteella voit käsitellä lomakkeen lähettämistä miten haluat. Tässä on esimerkki:

alkaen django.shortcuts tuonti renderöidä
alkaen django.middleware.csrf tuonti get_token, _unmask_cipher_token
alkaen django.utils.crypto tuonti vakio_aika_vertailu

defsinun_näkymäsi(pyyntö):
# Luo mukautettu CSRF-tunnus
csrf_token = get_token (pyyntö)
csrf_cookie = pyyntö. COOKIES.get('csrftoken')

# paljasta csrf-tunnus
unmasked_csrf_token = _unmask_cipher_token (csrf_token)

# Vertaa tokeneja
josei permanent_time_compare (unmasked_csrf_token, csrf_cookie):
# Käsittele tapausta, jossa merkit eivät täsmää
kulkea
muu:
# Käsittele tapausta, jossa merkit täsmäävät
kulkea

# Renderöi malli
konteksti = {
'csrf_token': csrf_token,
}

palata renderöi (pyyntö, "sovelluksen_nimi/malli.html", konteksti=konteksti)

Tämä koodinpätkä hakee csrf_cookie HTTP-pyyntöobjektista. Sitten se käyttää _unmask_cipher_token() toiminto paljastaa csrf_token.

Ehdollinen lauseke vertaa haettujen arvoja csrf_cookie ja paljastamaton csrf_token. Tässä vertailussa käytetään vakio_aika_vertailu toiminto, joka suojaa ajoitushyödykkeiltä. Voit kirjoittaa logiikkasi vertailun tuloksen perusteella.

CSRF-suojauksen poistaminen käytöstä Djangossa

Vaikka Django tekee oletusasetuksen CSRF-suojaukselle, voit halutessasi poistaa sen käytöstä projektissasi. Voit tehdä tämän kahdella tavalla:

  • CSRF-suojauksen poistaminen käytöstä koko verkkosivustollasi.
  • CSRF-suojauksen poistaminen käytöstä tietyssä näkymässä.

CSRF-suojauksen poistaminen käytöstä koko verkkosivustollasi

Voit poistaa Djangon CSRF-suojauksen käytöstä verkkosivustollasi poistamalla CSRF-väliohjelmiston asetustiedostostasi. Etsi asetustiedostosta luettelo nimeltä VÄLIOHJEET. Etsi luettelosta tämä:

'django.middleware.csrf. CsrfViewMiddleware',

Kun löydät sen, poista se koodistasi Djangon oletusarvoisen CSRF-suojauksen poistamiseksi käytöstä.

CSRF-suojauksen poistaminen käytöstä tietyssä näkymässä

Jos haluat poistaa CSRF-suojauksen käytöstä vain tietyssä Django-näkymässä, käytä @csrf_vapautettu sisustusarkkitehti. Tässä on koodinpätkä havainnollistamaan:

alkaen django.views.decorators.csrf tuonti csrf_vapautettu

@csrf_vapautettu
defnäkymän_nimi(pyyntö):
# suorita näkymälogiikka
kulkea

The @csrf_vapautettu decorator on vain yksi monista Djangon CSRF-suojaukseen liittyvistä. Loput voit lukea osoitteesta Djangon CSRF-viite.

Älä poista CSRF-suojausta käytöstä verkkosivustollasi

Vaikka Django mahdollistaa sen, Djangon sisäänrakennetun CSRF-suojausmekanismin poistamista käytöstä ei suositella. Tämä tekee sivustostasi haavoittuvan CSRF-hyökkäyksille ja vaikuttaa lopulta kielteisesti sovelluksesi käyttäjiin.

Ellet ole kokenut kehittäjä, joka osaa toteuttaa mukautetun CSRF-suojausmekanismin, sinun tulee työskennellä Djangon tarjoaman vaihtoehdon kanssa.