CSRF (Siteler arası istek sahteciliği): Siteler arası istek sahteciliği, yaygın bir ağ saldırısı yöntemidir. CSRF tam olarak nedir ve nasıl savunulur?
CSRF ilkesi
CSRF saldırı süreci aşağıdaki şekilde gösterilmektedir:
Kısacası, saldırgan sizin adınıza e-posta ve mesaj göndermek, paranızla bir şeyler satın almak ve hesabınızdan paranızı transfer etmek gibi yasal kimliğinizi çalmış ve adınıza kötü niyetli istekler göndermiştir. Sonuçlar felaket olabilir.
CRRF savunması
CSRF'yi savunmanın muhtemelen birkaç yolu vardır:
Django'nun çözümü
Django, CSRF koruması için ara yazılım (CsrfMiddleware) kullanır. Spesifik ilkeler aşağıdaki gibidir:
Şu anda işlenen isteği değiştirin, tüm POST formlarına gizli bir form alanı ekleyin, csrfmiddlewaretoken adını kullanın ve değer, geçerli oturum kimliğinin karma değeri artı bir anahtardır. Oturum kimliği ayarlanmadıysa, ara yazılım yanıt sonucunu değiştirmeyecektir, bu nedenle oturumu kullanmayan istekler için performans kaybı ihmal edilebilir.
Oturum tanımlama bilgisi seti içeren tüm gelen POST istekleri için, csrfmiddlewaretoken olup olmadığını ve doğru olup olmadığını kontrol eder. Aksi takdirde, kullanıcı 403HTTP hatası alacaktır. 403 hata sayfasının içeriği, etki alanları arası bir istek maskelemesinin tespit edilmesi ve isteğin sonlandırılmasıdır.
Unutulmaması gereken bir diğer nokta da, HTML dışı istekleri dönüştürmekten kaçınmak için, ara yazılımın yanıt sonucunu düzenlemeden önce Content-Type başlığını kontrol etmesidir. Yalnızca text / html veya application / xml + xhtml olarak işaretlenen sayfalar değiştirilecektir. Daha sonra, özel kullanım yöntemi tanıtıldı.
POST formu gönderme
1. Ara yazılım ekleyin
Settings.py MIDDLEWARE_CLASSES içindeki "django.middleware.csrf.CsrfViewMiddleware" ara yazılımını ekleyin ve daha sonra csrf korumasını global olarak kullanabilirsiniz (varsayılan olarak eklenir);
Tek görünüm kontrolü için görünüm işlevine @csrf_protect de ekleyebilirsiniz, ancak bu, eksiklikler olabileceğinden önerilen yöntem değildir.
Not: Bu ara yazılım, SessionMiddleware'den sonra yürütülmelidir, bu nedenle CsrfMiddleware, listede SessionMiddleware'den sonra görünmelidir. Aynı zamanda, yanıt sonucunu yanıt sıkıştırılmadan veya sıkıştırılmadan önce işlemelidir, bu nedenle CsrfMiddleware, GZipMiddleware'den sonra yürütülmelidir.
2. Şablondaki ayarlar
POST tarafından gönderilen forma {% csrf_token%} ekleyin
Veya formatı formla tutarlı tutun, forma ekleyin
3. İşlev ayarlarını görüntüleyin
Yaygın olarak kullanılan 3 yöntem vardır:
Manuel olarak csrftoken oluşturun ve bunu şablon bağlamına ekleyin:
RequestContext'i kullanın
Oluşturmayı doğrudan kullanın
Çerezdeki csrf değerini doğrulamaya gerek yoksa
Karşılık gelen işlev artı @csrf_exempt decorator
Ajax POST isteği gönder
1. Ayarlar yukarıdakiyle aynıdır
2. Şablondaki ayarlar
2 yöntem vardır:
html şablonunun komut dosyası etiketini ekleyin (Not: js dosyasında ayarlanamaz)
İstek başlığını ayarla
Çerez eklentisi kullan
https://github.com/js-cookie/js-cookie/
İlki daha basit.
3. Görünüm işlevi ayarları yukarıdakiyle aynıdır
Diğer şablon motorları (jinja2 ile birlikte)
1. Ayarlar ve görünüm işlevi ayarları yukarıdakiyle aynıdır
2. Şablon ayarları
Jinja, aşağıdaki gibi ayarlanan {% csrf_token%} 'i tanıyamıyor
veya
3. Ayarları yukarıdaki gibi görüntüleyin