Apsaugokite savo svetainę nuo labai paplitusių saugos spragų naudodami „Django“ integruotą CSRF tvarkymą.
„Django“ yra „Python“ žiniatinklio sistema, kurią galite naudoti kurdami saugias žiniatinklio programas. Ji siūlo daugybę funkcijų, padedančių kūrėjams užtikrinti saugumą. Viena iš šių funkcijų yra CSRF prieigos raktai, būtini norint apsaugoti formas nuo Cross-Site Request Forgery atakų.
Kas yra CSRF prieigos raktas?
CSRF prieigos raktas yra saugos funkcija, apsauganti žiniatinklio programas nuo Cross-Site Request Forgery (CSRF) atakos. Tai leidžia programų serveriui patikrinti, ar forma pateikta iš autentiškos naršyklės, ar įsilaužėlis ją suklastojo.
CSRF prieigos raktai yra formos įvestis, kuri seka vartotojo seansą. Svetainės serverio žiniatinklio taikomųjų programų sistema paprastai generuoja CSRF prieigos raktus kiekvienai unikaliam vartotojo seansui. Serveris patikrina, ar prieigos raktas yra teisingas, kai vartotojas pateikia formą. CSRF žetonus paprastai sudaro atsitiktinės eilutės ir skaičiai, todėl jų reikšmės yra nenuspėjamos.
CSRF žetonų generavimas Django
Django get_token() funkcija atsitiktinai generuoja CSRF žetonus. Norėdami rasti šią funkciją, eikite į csrf.py failą savo viduje Python virtuali aplinka. Aplanko struktūra turėtų atrodyti taip:
env/
└── Lib/
└── svetainės paketai/
└── django/
└── tarpinė programinė įranga/
└── csrf.py
Šio failo viduje rasite get_token() funkcija, kuri grąžina žetoną. Django naudoja duomenų maskavimas apsaugoti žetono vertę nuo įsilaužėlių.
Pagal numatytuosius nustatymus „Django“ įgalina jūsų svetainės CSRF apsaugą pridėdama django.middleware.csrf. CsrfViewMiddleware viduje VIDURINĖ ĮRANGA jūsų sąrašas settings.py failą. Viskas, ką jums reikia padaryti, tai pridėti {% csrf_token %} tavo PAST formų. Nepridedant {% csrf_token %}, gausite a 403 Uždrausta) klaida, kai pateikiate formą.
Kai pridedate {% csrf_token %} į jūsų formą, ji automatiškai sukuria paslėptą įvesties lauką su pavadinimu csrfmiddlewaretoken, kuriame yra užmaskuoto CSRF prieigos rakto reikšmė. Serveris naudoja šią reikšmę, kad nustatytų, ar formos pateikimas yra autentiškas. Šio paslėpto lauko vertę galite patikrinti peržiūrėdami puslapio šaltinį arba naudodami naršyklės kūrėjo įrankių funkciją.
Kaip CSRF žetonai veikia Django
Kai paleidžiate svetainę naudodami formą, „Django“ automatiškai sukuria a naršyklės slapukas paskambino csrftoken. Šis slapukas seka vartotojų veiklą svetainėje ir unikaliai identifikuoja kiekvieną vartotoją.
Kai vartotojas pateikia formą, serveris palygina slapuko vertę su slapuko verte csrfmiddlewaretoken paslėptame įvesties lauke. Jei šios reikšmės sutampa, serveris sėkmingai apdoros formą, priešingu atveju bus pateikta klaida.
Iš pirmo žvilgsnio slapuko reikšmės ir csrfmiddlewaretoken atrodo kitaip. Tai tyčia ir CSRF prieigos raktui suteikiamas papildomas apsaugos sluoksnis. CSRF prieigos raktas lyginamas su slapuku taip:
- The get_token() funkcija užmaskuoja CSRF prieigos raktą prieš perduodant jį į įvesties lauką.
- Kai forma pateikiama, CSRF prieigos raktas demaskuojamas naudojant slaptąjį raktą nustatymų faile.
- Neužmaskuotas prieigos raktas lyginamas su seanso slapuku.
- Jei reikšmės yra vienodos, forma apdorojama. Jei ne, serveris pateikia klaidą.
Kad įsilaužėliai nepavogtų jūsų CSRF prieigos rakto, „Django“ jį atnaujina kiekvieną kartą, kai pradeda vartotojo seansą.
Pasirinktinių CSRF žetonų kūrimas
Nors „Django“ leidžia lengvai apsaugoti formas tiesiog pridedant {% csrf_token %}, taip pat galima generuoti CSRF prieigos raktus ir rankiniu būdu įtraukti juos į formas. Norėdami tai padaryti, importuokite get_token() funkcija:
iš django.middleware.csrf importuoti get_token
Jūsų nuomone, CSRF prieigos raktą galite sugeneruoti taip:
defrodinio_pavadinimas(užklausa):
csrf_token = get_token (užklausa)# atlikti peržiūros logiką
kontekstas = {
"csrf_token": csrf_token
}
grąžinti pateikti (prašyti, „programos_pavadinimas/šablonas.html“, kontekstas=kontekstas)
Į savo HTML šabloną galite rankiniu būdu įtraukti įvesties žymą ir pridėti csrf_token prie jo taip:
<formametodas="POST" >
<įvestistipo="paslėpta"vardas=„csrfmiddlewaretoken“vertė=„{{ csrf_token }}“>
{{form.as_p}}
<mygtukątipo="Pateikti"klasė="btn btn-outline-secondary">Pridėti knygąmygtuką>
forma>
Arba galite sugeneruoti paslėptą įvesties lauką iš savo rodinių taip:
defjūsų_vaizdas(užklausa):
csrf_token = get_token (užklausa)
csrf_token_html = ''.format (csrf_token)# atlikti peržiūros logiką
kontekstas = {
"csrf_token": csrf_token_html
}
grąžinti pateikti (prašyti, „programos_pavadinimas/šablonas.html“, kontekstas=kontekstas)
Tada galite pridėti jį prie savo HTML šablono taip:
<formametodas="POST" >
{{ csrf_token_html|saugus }}
{{form.as_p}}
<mygtukątipo="Pateikti"klasė="btn btn-outline-secondary">Pridėti knygąmygtuką>
forma>
Jei norite visiškai valdyti savo formos CSRF apsaugą, tai galite padaryti palyginę savo CSRF prieigos raktą su naršyklėje saugomu slapuku. Remdamiesi palyginimo rezultatais, formos pateikimą galite tvarkyti taip, kaip norite. Štai pavyzdys:
iš django.shortcuts importuoti pateikti
iš django.middleware.csrf importuoti get_token, _unmask_cipher_token
iš django.utils.crypto importuoti pastovus_laikas_palygintidefjūsų_vaizdas(užklausa):
# Sukurkite pasirinktinį CSRF prieigos raktą
csrf_token = get_token (užklausa)
csrf_cookie = užklausa. COOKIES.get('csrftoken')# demaskuoti csrf prieigos raktą
unmasked_csrf_token = _unmask_cipher_token (csrf_token)
# Palyginkite žetonus
jeigune permanent_time_compare (unmasked_csrf_token, csrf_cookie):
# Tvarkykite atvejį, kai žetonai nesutampa
praeiti
Kitas:
# Tvarkykite atvejį, kai žetonai sutampa
praeiti
# Pateikite šabloną
kontekstas = {
„csrf_token“: csrf_token,
}
grąžinti pateikti (prašyti, „programos_pavadinimas/šablonas.html“, kontekstas=kontekstas)
Šis kodo fragmentas nuskaito csrf_cookie iš HTTP užklausos objekto. Tada jis naudoja _unmask_cipher_token() funkcija demaskuoti csrf_token.
Sąlyginis teiginys lygina gautų reikšmes csrf_cookie ir demaskuotas csrf_token. Šiame palyginime naudojama pastovus_laikas_palyginti funkcija, apsauganti nuo laiko išnaudojimų. Galite parašyti savo logiką, remdamiesi palyginimo rezultatu.
CSRF apsaugos išjungimas „Django“.
Nors „Django“ numato numatytąją CSRF apsaugos nuostatą, jei norite, galite ją išjungti savo projekte. Yra du būdai tai padaryti:
- CSRF apsaugos išjungimas visoje svetainėje.
- CSRF apsaugos išjungimas konkrečiame rodinyje.
CSRF apsaugos išjungimas visoje svetainėje
Norėdami išjungti „Django“ CSRF apsaugą savo svetainėje, tiesiog turite pašalinti CSRF tarpinę programinę įrangą iš nustatymų failo. Nustatymų faile raskite sąrašą pavadinimu VIDURINĖ ĮRANGA. Sąraše ieškokite šio:
„django.middleware.csrf. „CsrfViewMiddleware“,
Kai jį rasite, turėtumėte jį pašalinti iš savo kodo, kad galėtumėte jį išjungti, kad galėtumėte naudoti „Django“ numatytąją CSRF apsaugą.
CSRF apsaugos išjungimas konkrečiame rodinyje
Jei norite išjungti CSRF apsaugą tik konkrečiame Django rodinyje, naudokite @csrf_exempt dekoratorius. Čia yra kodo fragmentas, skirtas parodyti:
iš django.views.decorators.csrf importuoti csrf_exempt
@csrf_exempt
defrodinio_pavadinimas(užklausa):
# atlikti peržiūros logiką
praeiti
The @csrf_exempt dekoratorius yra tik vienas iš kelių, susijusių su CSRF apsauga Django. Apie visa kita galite perskaityti Django CSRF nuoroda.
Neišjunkite CSRF apsaugos savo svetainėje
Nors „Django“ tai leidžia, nerekomenduojama išjungti „Django“ integruoto CSRF apsaugos mechanizmo. Taip jūsų svetainė taps pažeidžiama CSRF atakų ir galiausiai neigiamai paveiks jūsų programos naudotojus.
Jei nesate patyręs kūrėjas, žinantis, kaip įdiegti pasirinktinį CSRF apsaugos mechanizmą, turėtumėte dirbti su „Django“ teikiama alternatyva.