Aizsargājiet savu vietni no ļoti izplatīta drošības cauruma, izmantojot Django iebūvēto CSRF apstrādi.
Django ir Python tīmekļa ietvars, ko varat izmantot, lai izveidotu drošas tīmekļa lietojumprogrammas. Tas piedāvā daudzas funkcijas, kas palīdz izstrādātājiem nodrošināt drošību. Viena no šīm funkcijām ir CSRF marķieri, kas ir būtiski, lai aizsargātu veidlapas no Cross-Site Request Forgery uzbrukumiem.
Kas ir CSRF marķieris?
CSRF marķieris ir drošības līdzeklis, kas aizsargā tīmekļa lietojumprogrammas no Cross-Site Request Forgery (CSRF) uzbrukumi. Tas ļauj lietojumprogrammu serverim pārbaudīt, vai veidlapas iesniegšana ir no autentiskas pārlūkprogrammas, vai arī hakeris to ir viltojis.
CSRF marķieri ir veidlapas ievades, kas seko lietotāja sesijai. Vietne servera puses tīmekļa lietojumprogrammu ietvars parasti ģenerē CSRF marķierus katrai unikālajai lietotāja sesijai. Serveris pārbauda, vai marķieris ir pareizs, kad lietotājs iesniedz veidlapu. CSRF marķieri parasti sastāv no nejaušām virknēm un skaitļiem, padarot to vērtības neparedzamas.
CSRF marķieru ģenerēšana pakalpojumā Django
Django's get_token() funkcija nejauši ģenerē CSRF marķierus. Lai atrastu šo funkciju, dodieties uz csrf.py fails jūsu iekšienē Python virtuālā vide. Mapes struktūrai vajadzētu izskatīties šādi:
env/
└── Lib/
└── vietņu paketes/
└── django/
└── starpprogrammatūra/
└── csrf.py
Šajā failā jūs atradīsiet get_token() funkcija, kas atgriež marķieri. Django izmanto datu maskēšana lai aizsargātu marķiera vērtību no hakeriem.
Pēc noklusējuma Django jūsu vietnei iespējo CSRF aizsardzību, pievienojot django.middleware.csrf. CsrfViewMiddleware iekš VIDUSPROGRAMMA jūsu saraksts settings.py failu. Viss, kas jums jādara, ir pievienot {% csrf_token %} uz tavu POSTĪT veidlapas. Bez pievienošanas {% csrf_token %}, jūs saņemsiet a 403 (aizliegts) kļūda, iesniedzot veidlapu.
Kad pievienojat {% csrf_token %} jūsu veidlapā, tas automātiski izveido slēptu ievades lauku ar nosaukumu csrfmiddlewaretoken, kas satur maskētā CSRF marķiera vērtību. Serveris izmanto šo vērtību, lai noteiktu, vai veidlapas iesniegšana ir autentiska. Varat pārbaudīt šī slēptā lauka vērtību, apskatot lapas avotu vai izmantojot pārlūkprogrammas izstrādātāja rīku funkciju.
Kā CSRF marķieri darbojas Django
Kad palaižat savu vietni, izmantojot veidlapu, Django automātiski izveido a pārlūkprogrammas sīkfails sauca csrftoken. Šī sīkdatne seko lietotāja aktivitātēm vietnē un unikāli identificē katru lietotāju.
Kad lietotājs iesniedz veidlapu, serveris salīdzina sīkfaila vērtību ar vērtību csrfmiddlewaretoken slēptajā ievades laukā. Ja šīs vērtības sakrīt, serveris veiksmīgi apstrādās veidlapu, pretējā gadījumā tiks parādīta kļūda.
No pirmā acu uzmetiena sīkdatnes vērtības un csrfmiddlewaretoken šķiet savādāk. Tas ir apzināti un pievieno papildu aizsardzības slāni CSRF pilnvarai. CSRF marķieris tiek salīdzināts ar sīkfailu šādi:
- The get_token() funkcija maskē CSRF marķieri pirms tā nodošanas ievades laukam.
- Kad veidlapa ir iesniegta, CSRF marķieris tiek atmaskots, izmantojot slepeno atslēgu iestatījumu failā.
- Atklātais marķieris tiek salīdzināts ar sesijas sīkfailu.
- Ja vērtības ir vienādas, veidlapa tiek apstrādāta. Ja nē, serveris atgriež kļūdu.
Lai neļautu hakeriem nozagt jūsu CSRF marķieri, Django to atjauno katru reizi, kad tiek sākta lietotāja sesija.
Pielāgotu CSRF marķieru izveide
Lai gan Django ļauj viegli aizsargāt jūsu veidlapas, vienkārši pievienojot {% csrf_token %}, iespējams arī ģenerēt CSRF marķierus un manuāli pievienot tos savām veidlapām. Lai to izdarītu, importējiet get_token() funkcija:
no django.middleware.csrf imports get_token
Pēc jūsu domām, varat ģenerēt CSRF pilnvaru šādi:
defskata_nosaukums(pieprasījums):
csrf_token = get_token (pieprasījums)# veikt skata loģiku
konteksts = {
"csrf_token": csrf_token
}
atgriezties renderēt (pieprasīt, 'app_name/template.html', konteksts=konteksts)
HTML veidnē varat manuāli iekļaut ievades tagu un pievienot csrf_token uz to šādi:
<formāmetodi="POSTĪT" >
<ievadeveids="slēpts"nosaukums="csrfmiddlewaretoken"vērtību="{{ csrf_token }}">
{{form.as_p}}
<poguveids="Iesniegt"klasē="btn btn-outline-secondary">Pievienot grāmatupogu>
formā>
Varat arī ģenerēt slēpto ievades lauku no saviem skatiem šādi:
defjūsu_skats(pieprasījums):
csrf_token = get_token (pieprasījums)
csrf_token_html = ''.format (csrf_token)# veikt skata loģiku
konteksts = {
"csrf_token": csrf_token_html
}
atgriezties renderēt (pieprasīt, 'app_name/template.html', konteksts=konteksts)
Pēc tam varat pievienot to savai HTML veidnei šādi:
<formāmetodi="POSTĪT" >
{{ csrf_token_html|drošs }}
{{form.as_p}}
<poguveids="Iesniegt"klasē="btn btn-outline-secondary">Pievienot grāmatupogu>
formā>
Ja vēlaties pilnībā kontrolēt savas veidlapas CSRF aizsardzību, varat to izdarīt, salīdzinot savu CSRF pilnvaru ar pārlūkprogrammā saglabāto sīkfailu. Pamatojoties uz salīdzināšanas rezultātiem, jūs varat rīkoties ar veidlapas iesniegšanu, kā vēlaties. Šeit ir piemērs:
no django.shortcuts imports renderēt
no django.middleware.csrf imports get_token, _unmask_cipher_token
no django.utils.crypto imports konstants_laika_salīdzinājumsdefjūsu_skats(pieprasījums):
# Ģenerējiet pielāgotu CSRF marķieri
csrf_token = get_token (pieprasījums)
csrf_cookie = pieprasījums. COOKIES.get('csrftoken')# atmaskot csrf marķieri
unmasked_csrf_token = _unmask_cipher_token (csrf_token)
# Salīdziniet žetonus
janē állandó_time_compare (unmasked_csrf_token, csrf_cookie):
# Apstrādājiet gadījumu, kad marķieri nesakrīt
caurlaide
cits:
# Apstrādājiet gadījumu, kad marķieri sakrīt
caurlaide
# Renderējiet veidni
konteksts = {
"csrf_token": csrf_token,
}
atgriezties renderēt (pieprasīt, 'app_name/template.html', konteksts=konteksts)
Šis koda fragments izgūst csrf_cookie no HTTP pieprasījuma objekta. Pēc tam tas izmanto _unmask_cipher_token() funkcija, lai atmaskotu csrf_token.
Nosacījuma priekšraksts salīdzina izgūtā vērtības csrf_cookie un atmaskotie csrf_token. Šis salīdzinājums izmanto konstants_laika_salīdzinājums funkcija, kas aizsargā pret laika noteikšanas izmantošanu. Jūs varat uzrakstīt savu loģiku, pamatojoties uz salīdzināšanas rezultātu.
CSRF aizsardzības atspējošana pakalpojumā Django
Lai gan Django nodrošina noklusējuma CSRF aizsardzību, varat to atspējot savā projektā, ja vēlaties. Ir divi veidi, kā to izdarīt:
- CSRF aizsardzības atspējošana visā jūsu vietnē.
- CSRF aizsardzības atspējošana noteiktā skatā.
CSRF aizsardzības atspējošana visā jūsu vietnē
Lai savā vietnē atspējotu Django CSRF aizsardzību, jums vienkārši ir jānoņem CSRF starpprogrammatūra no iestatījumu faila. Iestatījumu failā atrodiet sarakstu ar nosaukumu VIDUSPROGRAMMA. Sarakstā meklējiet šo:
'django.middleware.csrf. CsrfViewMiddleware',
Kad esat to atradis, noņemiet to no sava koda Django noklusējuma CSRF aizsardzībai, lai to atspējotu.
CSRF aizsardzības atspējošana noteiktā skatā
Ja vēlaties atspējot CSRF aizsardzību tikai noteiktā Django skatā, izmantojiet @csrf_exempt dekorators. Šeit ir koda fragments, lai parādītu:
no django.views.decorators.csrf imports csrf_exempt
@csrf_exempt
defskata_nosaukums(pieprasījums):
# veikt skata loģiku
caurlaide
The @csrf_exempt dekorators ir tikai viens no vairākiem, kas saistīti ar CSRF aizsardzību Django. Par pārējo varat lasīt Django CSRF atsauce.
Neatspējojiet CSRF aizsardzību savā vietnē
Lai gan Django tas ir iespējams, nav ieteicams atspējot Django iebūvēto CSRF aizsardzības mehānismu. Šādi rīkojoties, jūsu vietne kļūs neaizsargāta pret CSRF uzbrukumiem un galu galā negatīvi ietekmēs jūsu lietotnes lietotājus.
Ja vien neesat pieredzējis izstrādātājs, kurš zina, kā ieviest pielāgotu CSRF aizsardzības mehānismu, jums vajadzētu strādāt ar Django piedāvāto alternatīvu.