Türkiye IBAN doğrulama: Regex neden tek başına yeterli değildir?
Türkiye IBAN değerinde 26 karakterlik biçimi regex ile kontrol edin; gerçek kontrol basamaklarını doğrulamak için MOD 97 algoritmasını ayrıca uygulayın.
Türkiye IBAN değerini yalnızca regex ile kontrol etmek, 26 karakterlik biçimin doğru göründüğünü söyleyebilir; kontrol basamaklarının doğru olduğunu göstermez. Gerçek bir biçim doğrulaması için önce boşlukları kaldırıp büyük harfe çevirmek, sonra ülke/uzunluk regex’ini ve MOD 97 kontrolünü birlikte uygulamak gerekir.
Bu doğrulama IBAN’ın matematiksel olarak tutarlı olduğunu gösterir. Hesabın açık olduğunu, alıcının adını veya IBAN’ın belirli bir kişiye ait olduğunu kanıtlamaz.
Türkiye IBAN regex’i
Türkiye IBAN’ı TR ülke koduyla başlar ve toplam 26 alfanümerik karakter içerir. Türkiye’de ülke kodundan sonraki bölüm rakamlardan oluştuğu için normalize edilmiş değer şu regex ile kontrol edilebilir:
^TR\d{24}$
Kullanıcılar IBAN’ı dörderli gruplarla yazabildiği için boşlukları doğrulamadan önce kaldırın. Tire gibi farklı karakterleri sessizce kabul etmek yerine iş kuralınıza göre açıkça reddetmek daha güvenli olabilir.
Alan boş bırakılabiliyorsa zorunluluk kontrolünü regex’ten ayırın. Boş olmayan bir değer gönderildiğinde biçim ve MOD 97 adımlarının ikisi de çalışmalıdır.
MOD 97 kontrolü nasıl çalışır?
- İlk dört karakteri sona taşıyın.
- Harfleri A=10, B=11 … Z=35 biçiminde sayıya çevirin.
- Oluşan büyük sayının 97’ye bölümünden kalanı bulun.
- Geçerli IBAN için kalan 1 olmalıdır.
Sayı JavaScript’in güvenli tamsayı sınırını aşar. Bu nedenle bütün değeri Number yapmak yerine kalan hesabını rakam rakam ilerletin.
JavaScript IBAN doğrulama örneği
function validateTrIban(input) {
const iban = String(input).replace(/\s+/g, '').toUpperCase();
if (!/^TR\d{24}$/.test(iban)) return false;
const rearranged = iban.slice(4) + iban.slice(0, 4);
let numeric = '';
for (const char of rearranged) {
numeric += /[A-Z]/.test(char)
? String(char.charCodeAt(0) - 55)
: char;
}
let remainder = 0;
for (const digit of numeric) {
remainder = (remainder * 10 + Number(digit)) % 97;
}
return remainder === 1;
}
Fonksiyon önce ülke ve uzunluk kontrolü yapar, ardından ISO 13616’da kullanılan MOD 97-10 kontrolünü uygular. Uygulamanız birden fazla ülke destekliyorsa her ülkenin IBAN uzunluğunu ayrı tabloda tutun; her ülkeye Türkiye regex’ini uygulamayın.
Kullanıcı deneyimi için biçimlendirme
Input içinde boşluklu gösterim yapılabilir, fakat sunucuya gönderilen ve veritabanında saklanan canonical değer boşluksuz büyük harf biçiminde olmalıdır. Görsel formatlayıcı imleç konumunu bozuyorsa giriş tamamlandığında veya blur anında biçimlendirin.
function formatIban(value) {
return value.replace(/\s+/g, '')
.toUpperCase()
.replace(/(.{4})/g, '$1 ')
.trim();
}
Frontend kontrolünü backend’de tekrar edin. Tarayıcı doğrulaması değiştirilmiş istekleri engellemez.
Güvenlik ve iş kuralı ayrımı
Geçerli kontrol basamağı, ödeme yapılacak hesabın doğru kişiye ait olduğunu göstermez. Para transferi gibi kritik işlemlerde bankanın sağladığı alıcı doğrulama mekanizmaları, kullanıcı onayı ve işlem özeti ayrıca gerekir. IBAN değerlerini erişim loglarına veya hata izleme sistemine tam hâliyle yazmayın; gerektiğinde maskeleyin.
Hata mesajını “IBAN biçimi hatalı” ve “kontrol basamakları geçersiz” olarak ayırmak teknik ekip için yararlı olabilir. Son kullanıcıya fazla ayrıntı vermeden değeri yeniden kontrol etmesini söyleyen anlaşılır bir mesaj sunun.
Kısa rehber
Sık yapılan hata
^TR\d{24}$ eşleştiğinde IBAN’ı tamamen geçerli kabul etmek; regex kontrol basamaklarını hesaplamaz.