Django'nun yerleşik CSRF işlemesi ile web sitenizi çok yaygın bir güvenlik deliğinden koruyun.
Django, güvenli web uygulamaları oluşturmak için kullanabileceğiniz bir Python web çerçevesidir. Geliştiricilere güvenlik konusunda yardımcı olacak birçok özellik sunar. Bu özelliklerden biri, formları Siteler Arası İstek Sahteciliği saldırılarından korumak için gerekli olan CSRF belirteçleridir.
CSRF Simgesi Nedir?
CSRF belirteci, web uygulamalarını koruyan bir güvenlik özelliğidir. Siteler Arası İstek Sahteciliği (CSRF) saldırıları. Uygulama sunucusunun, bir form gönderiminin gerçek bir tarayıcıdan gelip gelmediğini veya bir bilgisayar korsanının sahte olup olmadığını kontrol etmesini sağlar.
CSRF belirteçleri, bir kullanıcı oturumunu takip eden form girdileridir. Bir web sitesinin sunucu tarafı web uygulama çerçevesi tipik olarak her benzersiz kullanıcı oturumu için CSRF belirteçleri oluşturur. Sunucu, kullanıcı her form gönderdiğinde belirtecin doğru olup olmadığını kontrol eder. CSRF belirteçleri genellikle rastgele dizilerden ve sayılardan oluşur ve bu da değerlerini öngörülemez hale getirir.
Django'da CSRF Token Üretimi
Django'nun Token Al() işlevi rastgele CSRF belirteçleri oluşturur. Bu işlevi bulmak için şuraya gidin: csrf.py içindeki dosya Python sanal ortamı. Klasör yapısı şöyle görünmelidir:
çevre/
└── Kitap/
└── site paketleri/
└── django/
└── ara yazılım/
└── csrf.py
Bu dosyanın içinde, Token Al() belirteci döndüren işlev. Django kullanımları veri maskeleme jetonun değerini bilgisayar korsanlarından korumak için.
Varsayılan olarak, Django ekleyerek siteniz için CSRF korumasını etkinleştirir. django.middleware.csrf. CsrfViewMiddleware içinde ARKA TAKIM senin liste ayarlar.py dosya. Tek yapmanız gereken eklemek {% csrf_token %} senin için POSTALAMAK formlar. eklemeden {% csrf_token %}, alacaksın 403 yasak) bir form gönderdiğinizde hata.
eklediğinizde {% csrf_token %} adı ile otomatik olarak gizli bir giriş alanı oluşturur. csrfmiddlewaretoken, maskelenmiş CSRF belirtecinin değerini içerir. Sunucu, form gönderiminin gerçek olup olmadığını belirlemek için bu değeri kullanır. Sayfa kaynağını görüntüleyerek veya tarayıcınızın geliştirici araçları özelliğini kullanarak bu gizli alanın değerini kontrol edebilirsiniz.
CSRF Jetonları Django'da Nasıl Çalışır?
Sitenizi formla başlattığınızda, Django otomatik olarak bir form oluşturur. tarayıcı çerezi isminde csrftoken. Bu tanımlama bilgisi, sitedeki kullanıcı etkinliğini takip eder ve her kullanıcıyı benzersiz şekilde tanımlar.
Kullanıcı formu gönderdiğinde, sunucu tanımlama bilgisinin değerini, csrfmiddlewaretoken gizli giriş alanında. Bu değerler eşleşirse sunucu formu başarıyla işler, aksi takdirde hata verir.
İlk bakışta çerezin değerleri ve csrfmiddlewaretoken farklı görünmektedir. Bu kasıtlıdır ve CSRF belirtecine ekstra bir koruma katmanı ekler. CSRF belirteci şu şekilde çerezle karşılaştırılır:
- bu Token Al() işlevi, CSRF belirtecini giriş alanına aktarmadan önce maskeler.
- Form gönderildiğinde, ayarlar dosyasındaki gizli anahtarın yardımıyla CSRF belirtecinin maskesi kaldırılır.
- Maskelenmemiş belirteç, oturum çereziyle karşılaştırılır.
- Değerler aynıysa, form işlenir. Değilse, sunucu bir hata döndürür.
Bilgisayar korsanlarının CSRF belirtecinizi çalmasını önlemek için, Django her kullanıcı oturumu başlattığında onu yeniler.
Özel CSRF Jetonları Oluşturma
Django formlarınızı basitçe ekleyerek korumayı kolaylaştırsa da {% csrf_token %}, CSRF belirteçleri oluşturmak ve bunları formlarınıza manuel olarak eklemek de mümkündür. Bunu yapmak için içe aktarın Token Al() işlev:
itibaren django.middleware.csrf içe aktarmak Token Al
Size göre CSRF belirtecini şu şekilde oluşturabilirsiniz:
kesingörünüm_adı(rica etmek):
csrf_token = get_token (istek)# görünüm mantığını gerçekleştir
bağlam = {
"csrf_token": csrf_token
}
geri dönmek render (istek, "uygulama_adı/şablon.html", bağlam=bağlam)
HTML şablonunuza, giriş etiketinizi manuel olarak dahil edebilir ve csrf_token ona şöyle:
<biçimyöntem="POSTALAMAK" >
<giriştip="gizlenmiş"isim="csrfmiddleware belirteci"değer="{{ csrf_token }}">
{{form.as_p}}
<düğmetip="göndermek"sınıf="btn btn-anahat-ikincil">Kitap Ekledüğme>
biçim>
Alternatif olarak, görünümlerinizden gizli giriş alanını şu şekilde oluşturabilirsiniz:
kesinsenin açından(rica etmek):
csrf_token = get_token (istek)
csrf_token_html = ''.format (csrf_token)# görünüm mantığını gerçekleştir
bağlam = {
"csrf_token": csrf_token_html
}
geri dönmek render (istek, "uygulama_adı/şablon.html", bağlam=bağlam)
Daha sonra bunu HTML şablonunuza şu şekilde ekleyebilirsiniz:
<biçimyöntem="POSTALAMAK" >
{{ csrf_token_html|güvenli }}
{{form.as_p}}
<düğmetip="göndermek"sınıf="btn btn-anahat-ikincil">Kitap Ekledüğme>
biçim>
Formunuzun CSRF korumasını tamamen kontrol etmek istiyorsanız, bunu CSRF belirtecinizi tarayıcıda depolanan çerezle karşılaştırarak yapabilirsiniz. Karşılaştırma sonuçlarına göre, form gönderimini istediğiniz gibi gerçekleştirebilirsiniz. İşte bir örnek:
itibaren django.kısayollar içe aktarmak işlemek
itibaren django.middleware.csrf içe aktarmak get_token, _unmask_cipher_token
itibaren django.utils.crypto içe aktarmak sabit_zaman_karşılaştırkesinsenin açından(rica etmek):
# Özel bir CSRF belirteci oluşturun
csrf_token = get_token (istek)
csrf_cookie = istek. ÇEREZLER.get("csrftoken")# csrf jetonunun maskesini kaldır
unmasked_csrf_token = _unmask_cipher_token (csrf_token)
# Belirteçleri karşılaştırın
eğerOlumsuz Constant_time_compare (masked_csrf_token, csrf_cookie):
# Belirteçlerin eşleşmediği durumu ele alın
geçmek
başka:
# Belirteçlerin eşleştiği vakayı ele alın
geçmek
# Şablonu oluştur
bağlam = {
"csrf_token": csrf_token,
}
geri dönmek render (istek, "uygulama_adı/şablon.html", bağlam=bağlam)
Bu kod parçacığı, csrf_cookie HTTP istek nesnesinden. Daha sonra kullanır _unmask_cipher_token() maskesini kaldırma işlevi csrf_token.
Koşullu bir ifade, alınan değerleri karşılaştırır. csrf_cookie ve maskesiz csrf_token. Bu karşılaştırma, sabit_zaman_karşılaştır zamanlama istismarlarına karşı koruma işlevi. Karşılaştırma sonucuna göre mantığınızı yazabilirsiniz.
Django'da CSRF Korumasını Devre Dışı Bırakma
Django, CSRF koruması için varsayılan bir provizyon oluştursa da, isterseniz bunu projenizde devre dışı bırakabilirsiniz. Bunu yapmanın iki yolu vardır:
- Web sitenizin tamamında CSRF korumasını devre dışı bırakma.
- Belirli bir görünümde CSRF korumasını devre dışı bırakma.
Tüm Web Sitenizde CSRF Korumasını Devre Dışı Bırakma
Django'nun CSRF korumasını web sitenizde devre dışı bırakmak için CSRF ara yazılımını ayarlar dosyanızdan kaldırmanız yeterlidir. Ayarlar dosyanızda, adlı bir liste bulun. ARKA TAKIM. Listenin içinde şunu arayın:
'django.middleware.csrf. CsrfViewMiddleware',
Onu bulduğunuzda, Django'nun varsayılan CSRF korumasının devre dışı bırakması için onu kodunuzdan çıkarmalısınız.
Belirli Bir Görünümde CSRF Korumasını Devre Dışı Bırakma
Yalnızca belirli bir Django görünümünde CSRF korumasını devre dışı bırakmak istiyorsanız, @csrf_exempt dekoratör. İşte göstermek için bir kod parçacığı:
itibaren django.views.decorators.csrf içe aktarmak csrf_exempt
@csrf_exempt
kesingörünüm_adı(rica etmek):
# görünüm mantığını gerçekleştir
geçmek
bu @csrf_exempt dekoratör, Django'daki CSRF korumasıyla ilgili birkaç kişiden yalnızca biridir. Geri kalanı hakkında okuyabilirsiniz Django'nun CSRF referansı.
Web Sitenizde CSRF Korumasını Devre Dışı Bırakmayın
Django bunu mümkün kılsa da, Django'nun yerleşik CSRF koruma mekanizmasının devre dışı bırakılması önerilmez. Bunu yapmak, sitenizi CSRF saldırılarına karşı savunmasız hale getirecek ve sonuç olarak uygulamanızın kullanıcılarını olumsuz etkileyecektir.
Özel bir CSRF koruma mekanizmasının nasıl uygulanacağını bilen deneyimli bir geliştirici değilseniz, Django tarafından sağlanan alternatifle çalışmalısınız.