- Node.js
- 3D Secure
- Güvenlik
3D Secure callback'lerini doğrulamak ve başarılı bir POST'a neden güvenmemelisiniz
3D Secure sonrası banka sonucu sunucunuzdaki herkese açık bir URL'ye POST eder. Bu isteğin neden kendi bilgilerinizle doğrulanması gerektiğini ve Better Payment'in bunu nasıl yaptığını öğrenin.
Yazar:Furkan Özay
1 dk okuma
Müşteri 3D Secure'u tamamladıktan sonra banka sonucu sunucunuza, callbackUrl adresinize bir POST ile geri gönderir. Kodunuz bunu okur ve siparişi ödendi olarak işaretler.
Bu cümlede gizli bir sorun var: callbackUrl herkese açık bir URL'dir. Adresi bilen herkes "başarılı" diyen bir POST gönderebilir.
Sahte bir callback bedava sipariştir
Sunucunuz callback'e gelen her şeye inanıyorsa saldırganın karta ihtiyacı yoktur. Ödeme sayfanızın kaynağında duran URL'ye ve doğru görünen bir istek gövdesine ihtiyacı vardır. Sipariş ödendi olarak işaretlenir ve ürün gönderilir.
Çözüm URL'yi gizlemek değildir. Çözüm, her callback'i yalnızca sizin ve sağlayıcının bildiği bir şeye karşı doğrulamaktır: kimlik bilgileriniz.
Better Payment bunu nasıl ele alır?
Callback gövdesini geldiği gibi iletin:
const result = await payment.completeThreeDSPayment(callbackBody);
if (result.status === 'success') {
// siparişi ödendi olarak işaretle
}Kütüphane callback'i kimlik bilgilerinizle doğrular ve sağlayıcı gerektiriyorsa ödemeyi sağlayıcıyla sonlandırır. Sahte veya başarısız bir callback her zaman failure döner.
Pratikte önemli birkaç ayrıntı:
- Gövdeyi olduğu gibi iletin. Ayrıştırıp yeniden serileştirmek imzalanan veriyi değiştirebilir. POST gövdesini aynen verin.
INVALID_HASHsahte demektir. Bir imza doğrulanamadığında sonuç bu kodu taşır. Bunu saldırı olarak değerlendirin, loglayın ve siparişi incelemeye işaretleyin.- Ayrıntıları müşteriye göstermeyin.
INVALID_HASHveFRAUD_SUSPECTEDayrıntıları müşteriye değil saldırgana yarar. Genel bir mesaj gösterin.
Bunu handler'a bırakın
Route'u kendiniz yazmak zorunda değilsiniz. HTTP handler callback route'larını sizin için bağlar ve varsayılan olarak güvenlidir: yalnızca callback'leri ve kart sorgularını açar. İade, iptal ve sorgular bir authorize hook'u gerektirir; yani yanlışlıkla internete açık kalmazlar.
Next.js için Next.js rehberine bakın.
Yalnızca doğrulanmış sonuçlara tepki verin
Her sonucu elle kontrol etmek yerine ödeme olaylarını dinleyin. Bunlar her sağlayıcı ve akış için, sağlayıcı sonucu doğruladıktan sonra yayınlanır:
payment.on('payment.succeeded', async (event) => {
await orders.markPaid(event.conversationId, event.paymentId);
});
payment.on('payment.failed', async (event) => {
await orders.markFailed(event.conversationId, event.code);
});Böylece sipariş mantığınız URL'nize ne ulaştıysa ona değil, doğrulanmış sonuçlara göre çalışır.
Kısa bir kontrol listesi
- Callback'inize bir istek ulaştı diye siparişi asla ödendi işaretlemeyin.
- Kimlik bilgilerinizle doğrulayın; sağlayıcı gerektiriyorsa onunla sonlandırın.
- Callback gövdesini olduğu gibi iletin.
INVALID_HASHdeğerini sahte olarak ele alın.- Tutarları tarayıcıdan değil, kendi sipariş verinizden sunucuda oluşturun.
Okumaya devam edin
- Next.js
- iyzico
- 3D Secure
Next.js ile iyzico 3D Secure entegrasyonu: adım adım rehber
Next.js App Router'da iyzico ile 3D Secure ödeme almak: kurulum, sunucuda istek oluşturma, callback doğrulama ve siparişi güncelleme.
- Node.js
- iyzico
- Geçiş
iyzipay paketinden Better Payment'a geçiş
Resmi iyzipay Node.js paketini kullanıyorsanız Better Payment'a nasıl geçersiniz: kod karşılaştırması, callback doğrulama ve adım adım geçiş listesi.