JWT'yi istemci bilgisayarda depolamamız gerekiyor. Bir LocalStorage / SessionStorage içinde saklarsak, bir XSS saldırısı tarafından kolayca yakalanabilir. Bir çerezleri çerezlerde saklarsak, bir bilgisayar korsanı bir CSRF saldırısında (okumadan) kullanabilir ve kullanıcıyı taklit edebilir ve API'mizle iletişime geçebilir ve eylemler yapmak veya kullanıcı adına bilgi almak için istek gönderebilir.
Ancak çerezlerde JWT'yi kolayca çalınmamasını sağlamak için birkaç yol vardır (ancak bunları çalmak için bazı gelişmiş teknikler vardır). Ancak LocalStorage / SessionStorage'a güvenmek istiyorsanız, basit bir XSS saldırısı ile erişilebilir.
Bu yüzden CSRF sorununu çözmek için uygulamamda Çifte Gönder Çerezleri kullanıyorum.
Çerezleri Çift Gönderme Yöntemi
JWT'yi bir HttpOnly çerezinde saklayın ve HTTPS üzerinden aktarmak için güvenli modda kullanın.
CSRF saldırılarının çoğunun, isteklerinde orijinal sunucunuzla farklı bir başlangıç veya yönlendirme başlığı vardır. Başlıkta bunlardan herhangi birinin olup olmadığını kontrol edin, alan adınızdan geliyorlar mı yoksa yoklar mı? Değilse onları reddet. İstekte hem başlangıç noktası hem de yönlendiren mevcut değilse endişelenmeyin. Bir sonraki adımda açıklayacağım X-XSRF-TOKEN başlık doğrulama sonuçlarının sonucuna güvenebilirsiniz.
Tarayıcı, istek alanınız için çerezlerinizi otomatik olarak sağlarken, yararlı bir sınırlama vardır: Bir web sitesinde çalışan JavaScript kodu, diğer web sitelerinin çerezlerini okuyamaz. CSRF çözümümüzü oluşturmak için bundan yararlanabiliriz. CSRF saldırılarını önlemek için, şu şekilde adlandırılan ekstra bir Javascript tarafından okunabilir çerez oluşturmalıyız: XSRF-TOKEN. Bu çerez kullanıcı oturum açtığında oluşturulmalı ve rastgele, tahmin edilemeyen bir dize içermelidir. Bu numarayı JWT'ye özel bir iddia olarak da kaydediyoruz. JavaScript uygulaması her istekte bulunmak istediğinde, bu kodu okuması ve özel bir HTTP başlığında göndermesi gerekir. Bu işlemler (çerezi okuma, üstbilgiyi ayarlama) yalnızca JavaScript uygulamasının aynı alanında gerçekleştirilebildiğinden,
Açısal JS hayatınızı kolaylaştırır
Neyse ki, platformumuzda Angular JS kullanıyorum ve Angular CSRF token yaklaşımını paketler, bu da uygulamamızı kolaylaştırıyor. Açısal uygulamamızın sunucudan yaptığı her istek için, Açısal $http
hizmet aşağıdaki işlemleri otomatik olarak yapar:
- Geçerli alanda XSRF-TOKEN adında bir çerez arayın.
- Bu çerez bulunursa, değeri okur ve X-XSRF-TOKEN başlığı olarak isteğe ekler.
Böylece müşteri tarafı uygulaması sizin için otomatik olarak halledilir! XSRF-TOKEN
Sunucu tarafında geçerli etki alanında adlandırılmış bir çerez ayarlamamız gerekiyor ve API'miz istemciden herhangi bir çağrı aldığında, X-XSRF-TOKEN
üstbilgiyi kontrol etmeli XSRF-TOKEN
ve JWT'deki ile karşılaştırmalıdır . Eğer eşleşirlerse, kullanıcı gerçektir. Aksi takdirde, sahte bir istektir ve yok sayabilirsiniz. Bu yöntem, "Çifte Gönder Çerez" yönteminden esinlenmiştir.
Dikkat
Gerçekte, hala XSS'ye karşı duyarlısınız, sadece saldırgan JWT jetonunu daha sonra kullanmak üzere çalamaz, ancak yine de XSS kullanarak kullanıcılarınızın adına istekte bulunabilir.
Daki JWT'yi saklamak ister localStorage
ya da değil HttpOnly çerez olarak XSRF-belirteci depolamak, hem XSS ile kolayca yakaladı edilebilir. HttpOnly çerezindeki JWT'niz bile XST yöntemi gibi gelişmiş bir XSS saldırısı ile yakalanabilir .
Bu nedenle, Çerezleri Çift Gönder yöntemine ek olarak, kaçan içerikler de dahil olmak üzere XSS'ye karşı her zaman en iyi uygulamaları izlemelisiniz. Bu, tarayıcının istemediğiniz bir şeyi yapmasına neden olacak tüm yürütülebilir kodları kaldırmak anlamına gelir. Bu genellikle // <![CDATA[
JavaScript'in değerlendirilmesine neden olan etiketleri ve HTML niteliklerini kaldırmak anlamına gelir .
Daha fazlasını buradan okuyun: