Stripe entegrasyonlarında webhook güvenliği kritik bir öneme sahiptir. Webhook çağrılarını doğrulamak, sadece Stripe’dan gelen yetkili istekleri kabul ederek sisteminizi korumaya alır. Bu noktada, Stripe’ın gönderdiği imza (signature) ile mesaj içeriğinin bütünlüğünü ve kaynağını kontrol etmek gerekir.
Stripe, webhook gönderdiğinde header’da ‘Stripe-Signature’ isimli bir alan ekler. Bu imzayı, belirli bir gizli anahtar ve zaman damgası kullanarak doğrulamak gerekir. Temel adımlar şu şekildedir:
- Header’dan imzayı al: Genellikle
headers['Stripe-Signature'] şeklinde erişilir. - Webhook gizli anahtarını belirle: Stripe Dashboard’dan alınan endpoint secret (örneğin:
whsec_...). - İmza ve payload’u doğrula: Stripe’ın önerdiği doğrulama algoritmasını kullanmak en güvenli yöntemdir.
Örneğin, PHP tabanlı bir çözümde:
1234567891011121314
$endpointSecret = 'whsec_...';
$sigHeader = $_SERVER['HTTP_STRIPE_SIGNATURE'];
$payload = file_get_contents('php://input');
try {
$event = \Stripe\Webhook::constructEvent($payload, $sigHeader, $endpointSecret);
} catch(\Stripe\Exception\SignatureVerificationException $e) {
// İmza doğrulaması başarısız
http_response_code(400);
exit('Webhook imzası doğrulanamadı.');
}
// Burada $event nesnesi güvenli ve Stripe’dan geldiği doğrulanmış olur
Stripe, resmi SDK’ları ve kütüphaneleri ile bu doğrulamayı oldukça basit hale getirir. Özellikle PHP, Python, Node.js gibi dillerde hazır fonksiyonlar vardır. Bu sayede manuel imza hesaplama hatalarını önleyerek güvenliği artırabilirsiniz.
Hata durumlarında ise, imza doğrulama başarısız olursa hemen işlem durdurup 400 hatası dönmek en doğru yaklaşımdır. Ayrıca, endpoint’lerinizde zaman damgasını kontrol ederek eski veya yeniden oynatılan istekleri yakalayabilirsiniz.
Stripe webhook güvenliği, sadece imza doğrulama ile sınırlı değildir. IP adresleri, rate limitler ve API anahtarlarının gizliliği gibi ek önlemler de alınmalıdır.
Siz bu konuda hangi yöntemleri kullanıyorsunuz? En çok hangi sorunlarla karşılaşıyorsunuz?