it-swarm-tr.com

Anti-CSRF form belirteçlerini uygulamanın doğru yolu nedir?

CSRF tamamen farkındayım ve zaten bazı güvenli formlar uyguladım, ancak henüz sonuçlardan hiç memnun kalmadım.

Kullanıcı adı, form bilgisi ve bir tuz md5 olarak belirteçler oluşturdum ve bir oturumda sakladım. Bu sekmeli tarama (bir dizi etkin karmaları tutarak düzeltilebilir) ve zamanlama ile ilgili bir sorun var. Hashlerimin sadece örneğin çalışmasını istiyorum. 10 dakika, ancak karmaya zamanla ilgili bir değişkeni nasıl koyabilirim?

Birisi beni CSRF güvenliğinin nasıl düzgün bir şekilde yapılacağını açıklayan iyi bir kaynağa yönlendirebilir mi?

34
naugtur

CSRF korumasını doğru şekilde oluşturmanın en iyi yolu:

Yapma.

En yaygın çerçevelerde bu koruma zaten yerleşik olarak bulunur (ASP.NET, Struts, Ruby Sanırım) veya zaten denenmiş varolan kütüphaneler var. (Örneğin OWASP'nin CSRFGuard ).

Bağlamınıza bağlı olarak başka bir seçenek de, yalnızca belirli, hassas işlemler için kullanıcının yeniden kimlik doğrulamasını zorunlu kılmaktır.


Yorumlarınıza göre, bunu kendiniz uygulamanız gerekiyorsa, çözümünüz çok kötü değil, ama basitleştireceğim.
Kripto-rastgele bir nonce (yeterince uzun) oluşturabilir, bunu oturum hafızasında saklayabilir ve her X dakikada bir değiştirebilirsiniz (son kullanma süresini de oturumda saklarsınız). Her formda, nonce öğesini gizli form alanına eklersiniz ve form gönderildiğinde bu değeri karşılaştırırsınız.
Form belirteci eşleşirse, anlaşılırsınız. Değilse, kabul edebilirsiniz örn. Edge kutularını işlemek için de önceki jeton.

Bununla birlikte, bunu kendiniz uygulamak için çok fazla başarısız girişim gördüm, ancak bu yolu gerçekten tavsiye etmek için söylemeliyim. Bunu sizin için yapmak için minimal bir paket bulmaktan daha iyidir.

25
AviD

OWASP hakkında iyi bir açıklama var: OWASP CSRF Önleme Hile Sayfası

Kısacası iki yol olduğunu söylüyorlar:

  1. Her kullanıcı oturumuna rastgele bir simge ekleyin. Yalnızca bu token mevcut ve doğru ise değişiklikler uygulanacaktır, aksi takdirde talep reddedilmelidir. Simgenin yalnızca bir POST isteği ile gönderilmesi önemlidir, çünkü GET istekleri belirteci farklı yerlere (tarayıcı geçmişi, günlük dosyaları vb.) Sızdırabilir.

    İstek başına bir token oluşturmak da mümkündür, ancak bu kullanılabilirlik sorunlarına yol açar. Örneğin, geri düğmesi artık düzgün çalışmaz. Ancak elbette güvenlik artacaktır.

    Ayrıca, jetonun yalnızca TLS üzerinden gönderildiğinden (güvenliği daha da artırmak için) emin olun, bu nedenle orta sorunlarda kimse olmayacaktır.

  2. Diğer seçenek bir çeşit meydan okuma - yanıt kullanmaktır (örneğin CAPTCHA'lar veya bir kerelik jetonlar).

OWASP-Sayfası, çalışmayan birkaç önlemi de listeler. Bunlar

  • (Gizli) çerezleri kullanma
  • GET isteklerini kullanmamak
  • Çok Adımlı İşlemler
  • URL Yeniden Yazma
27
Andreas Arnold

@Andreas Arnold cevabına ek olarak bir alternatif var. Encrypted Token Pattern OWasp'tan.

CSRF saldırılarını önlemenin yanı sıra, nesne güvenliğini uygulama avantajına da sahiptir.

Yalnızca nesneleri değiştirme yetkisi olanlar bunu yapabilir. Diğerleri doğru/geçerli şifre metnine veya anahtarına sahip olmayacaktır. Genellikle sessionId, timestamp, userId ve/veya recordId 'ı şifrelerim.

timestamp yeniden oynatmayı önler. sessionid yalnızca bu oturumdaki değişiklikleri yalıtır userId yalnızca bu kullanıcıdaki değişiklikleri yalıtır. recordId eklerseniz, ekstra işleme pahasına daha fazla güvenlik elde edersiniz.

3
Nasir