Teknik açıklama

CWaptcha nasıl çalışır

CWaptcha kullanıcılara görünmezdir çünkü koruma tamamen kriptografik katmanda gerçekleşir — UI katmanında değil. Her form gönderiminde şunlar olur.

1

Sunucu bir nonce yayınlar

Sayfanız yüklendiğinde cwaptcha.js otomatik olarak GET /cwaptcha/issue çağırır. Sunucunuz dört değer içeren bir JSON yükü ile yanıt verir:

{
  "captchaId":  "a1b2c3...",   // unique ID for this session
  "nonce":      "d4e5f6...",   // 32-byte random hex
  "token":      "g7h8i9...",   // HMAC of (captchaId|nonce|expiry|userAgent)
  "fieldSalt":  "j0k1l2..."    // per-session key for client-side HMAC
}

Sunucu captchaId → { nonce, fieldSalt, expiry, used: false }'u yapılandırılabilir TTL ile depolar (varsayılan 5 dakika). fieldSalt, ana SecretKey'den türetilir ve asla anahtarın kendisi değildir.

2

Tarayıcı standartlaştırır ve imzalar

Kullanıcı formu gönderdiğinde cwaptcha.js gönderme olayını yakalar ve:

  1. Tüm form alanı değerlerinin anlık görüntüsünü alır (honeypot alanı hariç)
  2. Bunları alan adına göre alfabetik olarak sıralar (sıralı karşılaştırma)
  3. Kurallı bir dize üretir: alan başına name=value\n, ardından nonce ve fieldSalt ekler
  4. Tarayıcının SubtleCrypto API'sini kullanarak HMAC-SHA256(fieldSalt, canonicalString) hesaplar
  5. captchaId, token ve userCalculatedCWaptchaHash'i gizli alan olarak ekler
⚡ Ana SecretKey hiçbir zaman tarayıcıya ulaşmaz. İstemci yalnızca oturum başına fieldSalt'ı görür.
3

Sunucu doğrular — altı kontrol

Middleware (veya [CWaptchaValidation] özelliği), işleyiciniz çağrılmadan önce bu kontrolleri sırayla çalıştırır:

1.
Honeypot boş
JS tarafından cw_hp_email adında gizli bir alan eklenir. Tüm alanları dolduran botlar hemen başarısız olur.
2.
Nonce mevcut ve kullanılmamış
Sunucu nonce deposunda captchaId'yi arar. Eksikse, süresi dolmuşsa veya zaten kullanılmışsa istek reddedilir.
3.
Süre dolmamış
Depolanan son kullanma tarihi mevcut UTC saatiyle karşılaştırılır. Önbelleğe alınmış sayfalardan gelen eski tokenler reddedilir.
4.
Token imzası geçerli
Sunucu HMAC(secret, captchaId|nonce|expiry|userAgent)'ı yeniden hesaplar ve sabit zamanlı eşitlikle karşılaştırır. Değiştirilmiş tokenler başarısız olur.
5.
Alan hash'i eşleşiyor
Sunucu kurallı alan HMAC'ını yeniden hesaplar ve userCalculatedCWaptchaHash ile sabit zamanlı eşitlikle karşılaştırır. Değiştirilmiş alan değerleri başarısız olur.
6.
Nonce kullanıldı işaretlendi
Başarı durumunda nonce atomik olarak kullanıldı işaretlenir (veya silinir). Aynı tokenle tekrar saldırıları her zaman başarısız olur.

Başarısızlık nedenleri

Neden Anlamı
expiredNonce bulunamadı, TTL doldu veya zaten kullanıldı
replayedToken ikinci kez gönderildi
hash_mismatchAlan HMAC'ı eşleşmiyor — form değiştirilmiş
honeypotGizli alan dolduruldu — muhtemelen bot
tamperedToken imzası geçersiz — token değiştirilmiş
https_requiredİstek HTTPS değil ve RequireHttps: true