Kaitske oma veebisaiti väga levinud turvaaukude eest Django sisseehitatud CSRF-käsitluse abil.

Django on Pythoni veebiraamistik, mida saate kasutada turvaliste veebirakenduste loomiseks. See pakub palju funktsioone, mis aitavad arendajatel turvalisust tagada. Üks neist funktsioonidest on CSRF-i märgid, mis on olulised vormide kaitsmiseks saidiüleste taotluste võltsimise rünnakute eest.

Mis on CSRF-märk?

CSRF-i tunnus on turvafunktsioon, mis kaitseb veebirakendusi Cross-Site Request Forgery (CSRF) rünnakud. See võimaldab rakendusserveril kontrollida, kas vormi esitamine pärines autentsest brauserist või võltsis selle häkker.

CSRF-märgid on vormi sisendid, mis jälgivad kasutaja seanssi. Veebisaidi oma serveripoolne veebirakenduste raamistik genereerib tavaliselt iga kordumatu kasutajaseansi jaoks CSRF-i märgid. Server kontrollib alati, kui kasutaja vormi esitab, kas luba on õige. CSRF-märgid koosnevad tavaliselt juhuslikest stringidest ja numbritest, muutes nende väärtused ettearvamatuks.

CSRF-i märgi genereerimine Djangos

Django oma get_token() funktsioon genereerib juhuslikult CSRF-i märgid. Selle funktsiooni leidmiseks navigeerige csrf.py fail teie sees Pythoni virtuaalne keskkond. Kausta struktuur peaks välja nägema järgmine:

env/

└── Lib/

└── saidipaketid/

└── django/

└── vahevara/

└── csrf.py

Selle faili seest leiate get_token() funktsioon, mis tagastab märgi. Django kasutab andmete maskeerimine et kaitsta märgi väärtust häkkerite eest.

Vaikimisi lubab Django teie saidile lisamise teel CSRF-i kaitse django.middleware.csrf. CsrfViewMiddleware aastal KESKVARA teie nimekiri settings.py faili. Kõik, mida pead tegema, on lisada {% csrf_token %} sinu juurde POSTITA vormid. Ilma lisamiseta {% csrf_token %}, saad a 403 (keelatud) viga vormi esitamisel.

Kui lisate {% csrf_token %} teie vormile, loob see automaatselt nimega peidetud sisestusvälja csrfmiddlewaretoken, mis sisaldab maskeeritud CSRF-i märgi väärtust. Server kasutab seda väärtust, et teha kindlaks, kas vormi esitamine on autentne. Selle peidetud välja väärtust saate kontrollida, vaadates lehe allikat või kasutades oma brauseri arendajatööriistade funktsiooni.

Kuidas CSRF-i märgid Djangos töötavad

Kui käivitate oma saidi vormiga, loob Django automaatselt a brauseri küpsis helistas csrftoken. See küpsis jälgib kasutajate tegevust saidil ja tuvastab iga kasutaja kordumatult.

Kui kasutaja vormi esitab, võrdleb server küpsise väärtust küpsise väärtusega csrfmiddlewaretoken peidetud sisestusväljal. Kui need väärtused ühtivad, töötleb server vormi edukalt, vastasel juhul tekitab see vea.

Esmapilgul küpsise väärtused ja csrfmiddlewaretoken näivad olevat erinevad. See on tahtlik ja lisab CSRF-i märgile täiendava kaitsekihi. CSRF-i märki võrreldakse küpsisega järgmiselt:

  • The get_token() funktsioon maskeerib CSRF-i märgi enne selle sisestusväljale edastamist.
  • Kui vorm esitatakse, maskeeritakse CSRF-i luba seadete failis oleva salajase võtme abil.
  • Maskeerimata tunnust võrreldakse seansiküpsisega.
  • Kui väärtused on samad, töödeldakse vormi. Kui ei, tagastab server veateate.

Et häkkerid teie CSRF-i märgi varastada ei saaks, uuendab Django seda iga kord, kui kasutaja seanssi alustab.

Kohandatud CSRF-i märkide loomine

Kuigi Django muudab teie vormide kaitsmise lihtsaks, lisades lihtsalt {% csrf_token %}, on võimalik ka CSRF-i lubade genereerimine ja nende käsitsi vormidele lisamine. Selleks importige get_token() funktsioon:

alates django.middleware.csrf importida get_token

Teie arvates saate CSRF-i märgi luua järgmiselt:

defvaate_nimi(taotlus):
csrf_token = get_token (taotlus)

# teostada vaateloogikat
kontekst = {
"csrf_token": csrf_token
}

tagasi renderdama (päring, „rakenduse_nimi/template.html”, kontekst=kontekst)

Saate oma HTML-malli käsitsi lisada sisendmärgendi ja lisada csrf_token sellele nii:

<vormimeetod="POSTITA" >
<sisendtüüp="peidetud"nimi="csrfmiddlewaretoken"väärtus="{{ csrf_token }}">
{{form.as_p}}
<nupputüüp="Esita"klass="btn btn-outline-sekundaarne">Lisa raamatnuppu>
vormi>

Teise võimalusena saate oma vaadetest peidetud sisestusvälja luua järgmiselt.

defteie_vaade(taotlus):
csrf_token = get_token (taotlus)
csrf_token_html = ''.format (csrf_token)

# teostada vaateloogikat
kontekst = {
"csrf_token": csrf_token_html
}

tagasi renderdama (päring, „rakenduse_nimi/template.html”, kontekst=kontekst)

Seejärel saate selle oma HTML-i mallile lisada järgmiselt:

<vormimeetod="POSTITA" >
{{ csrf_token_html|ohutu }}
{{form.as_p}}
<nupputüüp="Esita"klass="btn btn-outline-sekundaarne">Lisa raamatnuppu>
vormi>

Kui soovite oma vormi CSRF-kaitset täielikult kontrollida, saate seda teha, võrreldes oma CSRF-i luba brauseris salvestatud küpsisega. Võrdluse tulemuste põhjal saate vormi esitamist käsitleda nii, nagu soovite. Siin on näide:

alates django.otseteed importida renderdama
alates django.middleware.csrf importida get_token, _unmask_cipher_token
alates django.utils.crypto importida konstantse_aja_võrdlemine

defteie_vaade(taotlus):
# Looge kohandatud CSRF-märk
csrf_token = get_token (taotlus)
csrf_cookie = taotlus. COOKIES.get('csrftoken')

# demask csrf-märk
unmasked_csrf_token = _unmask_cipher_token (csrf_token)

# Võrrelge märke
kuimitte permanent_time_compare (unmasked_csrf_token, csrf_cookie):
# Käsitlege juhtumeid, kui märgid ei ühti
üle andma
muidu:
# Käsitlege juhtumit, kus märgid ühtivad
üle andma

# Renderdage mall
kontekst = {
'csrf_token': csrf_token,
}

tagasi renderdama (päring, „rakenduse_nimi/template.html”, kontekst=kontekst)

See koodilõik hangib alla csrf_cookie HTTP päringu objektist. Seejärel kasutab see _unmask_cipher_token() funktsioon maski paljastamiseks csrf_token.

Tingimuslause võrdleb otsitava väärtusi csrf_cookie ja maskeerimata csrf_token. See võrdlus kasutab konstantse_aja_võrdlemine funktsioon, mis kaitseb ajastuse ärakasutamise eest. Oma loogika saab kirjutada võrdluse tulemuse põhjal.

CSRF-i kaitse keelamine Djangos

Kuigi Django pakub CSRF-kaitse vaikeseadet, saate selle oma projektis soovi korral keelata. Selleks on kaks võimalust.

  • CSRF-i kaitse keelamine kogu veebisaidil.
  • CSRF-i kaitse keelamine konkreetsel vaatel.

CSRF-i kaitse keelamine kogu veebisaidil

Django CSRF-kaitse keelamiseks oma veebisaidil peate lihtsalt oma seadete failist eemaldama CSRF-i vahevara. Otsige oma seadete failist üles loend nimega KESKVARA. Otsige loendist seda:

'django.middleware.csrf. CsrfViewMiddleware',

Kui olete selle leidnud, peaksite selle oma koodist eemaldama Django CSRF-i vaikekaitse jaoks, et see keelata.

CSRF-i kaitse keelamine konkreetsel vaatel

Kui soovite CSRF-kaitse keelata ainult konkreetses Django vaates, kasutage @csrf_vabastatud dekoraator. Siin on demonstreerimiseks koodilõik:

alates django.views.decorators.csrf importida csrf_vabastus

@csrf_vabastatud
defvaate_nimi(taotlus):
# teostada vaateloogikat
üle andma

The @csrf_vabastatud dekoraator on vaid üks paljudest, mis on seotud Django CSRF-kaitsega. Ülejäänu kohta saate lugeda Django CSRF-i viide.

Ärge keelake oma veebisaidil CSRF-kaitset

Kuigi Django teeb selle võimalikuks, pole Django sisseehitatud CSRF-i kaitsemehhanismi keelamine soovitatav. See muudab teie saidi CSRF-i rünnakute suhtes haavatavaks ja mõjutab lõppkokkuvõttes teie rakenduse kasutajaid negatiivselt.

Kui te pole kogenud arendaja, kes teab, kuidas kohandatud CSRF-i kaitsemehhanismi rakendada, peaksite töötama Django pakutava alternatiiviga.