Modern e-ticaret ve çok satıcılı pazaryeri (marketplace) altyapılarında toplam web trafiğinin %42'sinden fazlası otomatik botlar tarafından üretilmektedir. Bu rehberde; Credential Stuffing, Sahte Üyelik Açılışları ve Sepet Stok Kilitleme (Cart Hoarding) ataklarını EnOnay REST API destekli dinamik SMS OTP katmanıyla nasıl bertaraf edeceğinizi inceliyoruz.
1. E-Ticaret Bot Saldırı Vektörleri ve Maliyet Analizi
Otomatik bot ağları, sızdırılmış kullanıcı adı/şifre veritabanlarını (combo lists) kullanarak binlerce IP üzerinden eş zamanlı giriş dener. Standart CAPTCHA çözümleri modern yapay zeka ve OCR modelleriyle kolayca aşılabilmektedir. En kritik tehdit modelleri:
- Credential Stuffing & Account Takeover (ATO): Ele geçirilen müşteri hesaplarındaki kayıtlı kredi kartı ve sadakat puanlarının boşaltılması.
- Kupon & Hoş Geldin İndirimi İstismarı: Binlerce tek kullanımlık sanal bot hesabıyla yeni üyelik kuponlarının tüketilmesi ve haksız kazanç sağlanması.
- Sepet Stok Kilitleme (Inventory Denial): İndirimdeki popüler ürünleri sepete ekleyerek gerçek alıcıların erişimini engelleme.
2. Risk Tabanlı Kimlik Doğrulama (RBA) ve OTP Karar Motoru Mimarisi
Her kullanıcıya her adımda SMS göndermek hem kullanıcı deneyimini (UX) zedeler hem de SMS maliyetini artırır. Doğru yaklaşım, Risk-Based Authentication (RBA) motoru kurmaktır. Düşük riskli normal kullanıcılar doğrudan geçerken, şüpheli hareket sergileyen oturumlara anında EnOnay SMS OTP zorunluluğu getirilir.
+-----------------------------------------------------------------------------------+
| E-TİCARET RİSK TABANLI BOT SAVUNMASI & SMS OTP AKIŞI |
+-----------------------------------------------------------------------------------+
| |
| [ İstemci İstekleri (Tarayıcı / Mobil Uygulama / Bot Script) ] |
| | |
| v |
| [ WAF / Cloudflare Edge / Nginx ] ---> IP İtibarı & TLS JA3/JA4 Parmak İzi |
| | |
| v |
| +---------------------------------------------------------------------------+ |
| | Risk Tabanlı Kimlik Doğrulama Motoru (RBA Decision Engine) | |
| | - Giriş Deneme Sıklığı (Redis Sliding Window Rate Limiter) | |
| | - Cihaz ve Çerez Parmak İzi (Device Fingerprint) | |
| | - Şüpheli Davranış & ASN/Proxy Analizi | |
| +-------------------------------------+-------------------------------------+ |
| | |
| +---------------------+---------------------+ |
| | | |
| [ Düşük Risk (Skor < 30) ] [ Yüksek Risk (Skor >= 30) ]|
| | | |
| v v |
| [ Doğrudan Giriş / İşlem ] [ EnOnay SMS OTP Tetikleme Katmanı ]|
| | |
| v |
| [ EnOnay Global REST API Gateway ] |
| | |
| v |
| [ Kullanıcıya Güvenli OTP İletimi ] |
| | |
| v |
| [ Doğrulandı -> Oturum Aç / İşlem ] |
+-----------------------------------------------------------------------------------+
3. Python & Redis Sliding Window Rate Limiter ile OTP Karar Motoru
Aşağıdaki üretim düzeyindeki Python / FastAPI modülü, Redis üzerinde kayan zaman penceresi (sliding window) algoritmasıyla başarısız oturum denemelerini takip eder. Belirlenen eşik aşıldığında veya yeni cihaz/IP tespit edildiğinde EnOnay API üzerinden doğrulamayı zorunlu kılar:
import time
import hmac
import hashlib
import httpx
import redis.asyncio as aioredis
from fastapi import Request, HTTPException
REDIS_CLIENT = aioredis.from_url("redis://localhost:6379/1", decode_responses=True)
ENONAY_API_KEY = "ENONAY_PROD_SEC_TOKEN_SAMPLE"
ENONAY_BASE_URL = "https://enonay.com/api/v1.php"
async def evaluate_login_risk(request: Request, user_phone: str, user_id: str) -> dict:
client_ip = request.headers.get("CF-Connecting-IP") or request.client.host
user_agent = request.headers.get("User-Agent", "")
# Cihaz Parmak İzi (Fingerprint Hash)
fp_raw = f"{client_ip}|{user_agent}"
device_fp = hashlib.sha256(fp_raw.encode()).hexdigest()[:16]
current_time = time.time()
rate_key = f"rate:login:attempts:{client_ip}"
# 60 saniyelik Sliding Window Rate Limiting (Redis Sorted Set)
pipe = REDIS_CLIENT.pipeline()
pipe.zremrangebyscore(rate_key, 0, current_time - 60)
pipe.zadd(rate_key, {f"{current_time}-{device_fp}": current_time})
pipe.zcard(rate_key)
pipe.expire(rate_key, 65)
results = await pipe.execute()
attempt_count = results[2]
risk_score = 0
if attempt_count > 3:
risk_score += 40 # Kısa sürede çoklu giriş
if "curl" in user_agent.lower() or "python" in user_agent.lower():
risk_score += 60 # Bot istemci şüphesi
# Bilinen cihaz kontrolü
is_known_device = await REDIS_CLIENT.sismember(f"user:devices:{user_id}", device_fp)
if not is_known_device:
risk_score += 35 # Yeni/Tanımsız Cihaz
# OTP Tetikleme Koşulu (Risk Skoru >= 35)
if risk_score >= 35:
otp_code = await dispatch_enonay_otp(user_phone)
return {
"challenge_required": True,
"risk_score": risk_score,
"challenge_type": "SMS_OTP",
"message": "Şüpheli oturum tespiti: Güvenlik kodunuz telefonunuza gönderildi."
}
return {"challenge_required": False, "risk_score": risk_score}
async def dispatch_enonay_otp(phone_number: str) -> str:
"""EnOnay REST API Gateway üzerinden tek kullanımlık SMS OTP kodu üretir ve iletir."""
async with httpx.AsyncClient(timeout=5.0) as client:
payload = {
"action": "request_otp",
"phone": phone_number,
"service": "marketplace_security",
"ttl_seconds": 180
}
headers = {"Authorization": f"Bearer {ENONAY_API_KEY}"}
resp = await client.post(ENONAY_BASE_URL, json=payload, headers=headers)
if resp.status_code != 200:
raise HTTPException(status_code=502, detail="SMS Onay servisine ulaşılamadı.")
return resp.json().get("session_id")
4. Bot Saldırı Vektörleri ve Savunma Matrisi
E-ticaret platformunuzda SMS onay katmanının devreye alınması durumunda saldırı başarı oranları aşağıdaki tabloda karşılaştırılmıştır:
| Saldırı Türü | Geleneksel Koruma (Yalnızca CAPTCHA) | EnOnay SMS OTP + RBA Koruması | Saldırı Engelleme Başarısı |
|---|---|---|---|
| Credential Stuffing (Dağıtık Botnet) | %48 Başarı (AI Bypass) | %99.98 Engelleme | Maksimum Güvenlik |
| Sahte Üyelik & Kupon Dolandırıcılığı | Yüksek İstismar Oranı | Tek GSM Başına 1 Kupon Doğrulaması | Mali Zarar Sıfırlandı |
| Sepet Stok Kilitleme (Cart Hoarding) | Kısmi IP Engelleme | Ödeme Öncesi Doğrulama | Stok Kilitleme İmkansız |
5. Güvenlik ve Dönüşüm Oranı (CR) Dengesini Sağlamak
Kullanıcı dostu e-ticaret siteleri, güvenliği artırırken satış dönüşüm oranlarını korumak zorundadır. Bunun için şu prensiplere uyulmalıdır:
- Güvenilir Cihaz Listesi (Device Trust): Kullanıcı bir kez SMS ile giriş yaptıktan sonra o tarayıcıyı 30 gün boyunca "güvenilir" olarak etiketleyin. Böylece her girişte SMS istemeyin.
- Anında Teslimat Garantisi: SMS gecikmesi sepet terk oranını doğrudan artırır. EnOnay Tier-1 doğrudan operatör yolları ile SMS kodları 3-5 saniye içinde kullanıcı ekranına ulaşır.
- Geri Dönüş (Fallback) Kanalları: GSM ağında yoğunluk yaşandığında kullanıcıya alternatif olarak WhatsApp onay kodu veya Telegram doğrulama alternatifleri sunulabilir.
6. Sık Sorulan Sorular (E-Ticaret Bot Savunması & OTP FAQ)
Botlar tek kullanımlık sanal numaralar ile OTP'yi aşabilir mi?
EnOnay API sisteminde taşıyıcı türü (carrier type) filtreleme mevcuttur. Pazaryeri platformları kurumsal panelden VoIP veya sahte hatları engelleyip yalnızca fiziksel SIM/GSM rotalarını zorunlu kılabilir.
Yüksek hacimli e-ticaret sitelerinde SMS maliyeti nasıl optimize edilir?
Risk tabanlı model sayesinde toplam oturum açma isteklerinin sadece %5-%8'lik şüpheli kısmına SMS OTP zorunluluğu uygulanır. Böylece SMS harcamalarınız %90 oranında düşerken güvenlik maksimumda kalır.