OTP Gönderimi: SMS ve Email'de Güvenlik Hatalarından Kaçın

İki faktörlü doğrulamada SMS ve email OTP göndermek basit görünse de, çoğu edtech platformu burada hata yapıyor. Echof76'nın rehberine göre, sorun genelde şu: SMS ve email için ayrı ayrı secret üretmek, mesajın gönderildiğini alındı sanmak, ya da iki kanalı eşit güvenilir kabul etmek.

Doğru yaklaşım çok daha basit. Bir kere challenge üret, bunu hesaba ve doğrulama denemesine bağla, sonra kullanıcıya hangi kanalı kullanacağını seçme özgürlüğü ver. Sunucu tarafında sadece verifier'ı (hash gibi) sakla, delivery state'i (gönderildi mi, alındı mı) takip et. Mesajın sağlayıcı tarafından kabul edilmesi ≠ kullanıcının onu alması. Bu fark kritik.

Kod tarafında transport-neutral bir yapı kur: Python çekirdeğin güvenlik politikasını belirlesin, Node.js handler ya da başka bir web sınırı ise provider-spesifik istekleri yönetsin. Böylece gerçek mesaj göndermeden önce delivery güvenilirliğini test edebilirsin.

1# Python çekirdeği: challenge ve verifier
2import secrets
3import hashlib
4from datetime import datetime, timedelta
5
6class OTPManager:
7def __init__(self, ttl_seconds=300):
8self.ttl = ttl_seconds
9self.challenges = {}
10
11def create_challenge(self, user_id):
12code = secrets.randbelow(1000000) # 6 haneli
13code_str = str(code).zfill(6)
14verifier = hashlib.sha256(code_str.encode()).hexdigest()
15expiry = datetime.utcnow() + timedelta(seconds=self.ttl)
16
17self.challenges[user_id] = {
18'verifier': verifier,
19'expiry': expiry,
20'attempts': 0,
21'used': False
22}
23return code_str # Sadece gönderme için
24
25def verify_code(self, user_id, provided_code):
26if user_id not in self.challenges:
27return False
28
29challenge = self.challenges[user_id]
30
31if challenge['used'] or datetime.utcnow() > challenge['expiry']:
32return False
33
34verifier = hashlib.sha256(provided_code.encode()).hexdigest()
35if verifier == challenge['verifier']:
36challenge['used'] = True
37return True
38
39challenge['attempts'] += 1
40return False

Handler'ında (Node.js veya başka) SMS/email adaptörlerini ayrı tut. Biri başarısız olursa, kullanıcı diğer kanalı deneyebilsin. Mesaj gönderme başarısı ile doğrulama başarısını karıştırma; ikisi de önemli ama ayrı metriklerde takip et.

Sonuç: bir challenge, bir verifier, iki kanal seçeneği. Güvenlik politikasını kod tarafında, provider detaylarını adapter tarafında tut. Bu şekilde test edilebilir, bakımı kolay ve gerçekten güvenli bir sistem kurarız.

konu hakkında tepkinizi verebilirsiniz