Webhook Güvenliği: HMAC-SHA256, Timestamp ve Replay Koruma
Webhook entegrasyonu basit görünse de üretim ortamında ciddi bir güvenlik açığı olabilir. Eğer gelen POST isteğini doğrulamadan işlersen, URL'i keşfeden biri sahte payment_intent.succeeded olayları gönderebilir, yakalanmış istekileri tekrar oynatabilir ya da zaman farkından yararlanabilir.
Muhammad Ali Mughal'ın yazısında belirttiği gibi, çoğu hata dört kalıba giriyor: HMAC'ı yeniden serileştirilmiş JSON üzerinde hesaplamak (ham istek baytları yerine), imza karşılaştırmasında === kullanmak (sabit zamanlı kontrol yerine), timestamp başlığını görmezden gelmek ya da hex ile Base64 arasında karışıklık yaşamak.
Doğru yaklaşım şu: Stripe'tan gelen webhook için, raw request body'yi (JSON string değil, tam bayt dizisi) ve secret key'i birleştirip HMAC-SHA256 ile imzala. Gelen imza ile karşılaştırırken `crypto.timingSafeEqual()` (Node.js) ya da benzeri sabit zamanlı fonksiyonları kullan. Timestamp başlığını kontrol ederek 5 dakikadan eski istekleri reddet. Böylece replay saldırılarını ve timing side-channel sızıntılarını önlemiş olursun.
Kaç kez debug ettiysen bile, webhook doğrulamasını copy-paste etme. Sağlayıcının SDK'sını (Stripe.php, Shopify Ruby gem) ya da kanıtlanmış bir kütüphaneyi kullan. Kendi imzalama mantığını yazarsan, hex/Base64 dönüşümleri ve bayt sırası hataları kaçınılmaz oluyor.
0 yorum