⚔️ Red vs. Blue #3: API Güvenliğinin Vebası: BOLA / IDOR Saldırıları
Modern web ve mobil uygulamaların kalbinde API'lar yatıyor. Ancak OWASP API Security Top 10’da en kritik risklerden biri: BOLA (Broken Object Level Authorization) ya da bilinen adıyla IDOR (Insecure Direct Object Reference).
🔴 Red Team Gözüyle: BOLA Nasıl Tespit Edilir?
Saldırganlar için BOLA, karmaşık istismar kodları gerektirmeyen ama yıkıcı sonuçlar doğuran en pratik zafiyet alanıdır.
Sayısal ID Avcılığı: /api/v1/invoices/1004 gibi bir istekte 1004 değerini 1005 veya 1006 yaparak başkasının faturasına erişebiliyorsanız BOLA gerçekleşmiş demektir.
Sadece GET Değil, Tehlikeli Metotlar: BOLA sadece veri okumakla sınırlı değildir. DELETE /api/v1/orders/8812 veya PUT /api/v1/users/505/role istekleri ile yetkisiz silme veya yetki yükseltme işlemleri yapılabilir.
UUID Yanılsaması: Birçok geliştirici ardışık ID (1, 2, 3) yerine UUID kullanınca güvende olduğunu sanır. Ancak UUID başka bir endpoint'ten veya sızıntıdan elde edilirse yetki kontrolü olmayan sistem yine teslim olur.
🔵 Blue Team Gözüyle: Doğru Yetkilendirme Mimarisi
Kimlik doğrulaması (Authentication) ile yetkilendirmeyi (Authorization) karıştırmamak gerekir. Bir kullanıcının sisteme giriş yapmış olması, her veriye erişebileceği anlamına gelmez.
Context-Aware (Bağlam Duyarlı) Kontrol: Her veri sorgusunda "Bu oturumu açan kullanıcı X, erişmek istediği Y nesnesinin sahibi mi?" kontrolü yapılmalıdır.
Merkezi Policy/Middleware Katmanı: Yetkilendirme mantığını controller fonksiyonlarının içine elle yazmak yerine, erişim kontrolünü merkezi servislerde veya ORM/Data Access katmanında otomatikleştirin.
BİLİNMEYENİ GİZLE (Generic Errors): Yetkisiz erişim denemelerinde 403 Forbidden yerine 404 Not Found dönerek nesnenin varlığını dahi saldırgandan gizleyin.
💻 Zafiyetli vs. Güvenli Kod Örneği (Python / FastAPI)
Python
# ❌ ZAFİYETLİ (BOLA var: Sadece giriş yapılmış mı kontrol ediyor)
@app.get("/invoices/{invoice_id}")
def get_invoice(invoice_id: int, current_user: User = Depends(get_current_user)):
return db.query(Invoice).filter(Invoice.id == invoice_id).first()
# ✅ GÜVENLİ (Nesne Seviyesinde Sahiplik Kontrolü Yapılıyor)
@app.get("/invoices/{invoice_id}")
def get_invoice(invoice_id: int, current_user: User = Depends(get_current_user)):
invoice = db.query(Invoice).filter(
Invoice.id == invoice_id,
Invoice.owner_id == current_user.id # Nesne sahipliği doğrulaması
).first()
if not invoice:
raise HTTPException(status_code=404, detail="Fatura bulunamadı")
return invoice
O zaman Mustafa soruyor: Projelerinizde nesne seviyesinde yetkilendirmeyi (BOLA/IDOR) nasıl kurguluyorsunuz? Yetki kontrollerini ORM seviyesinde mi yoksa middleware/policy katmanında mı tutuyorsunuz? Düşüncelerinizi yorumlarda paylaşın! 👇
Okuduğunuz için teşekkürler! Kendinize, verilerinize ve dijital zırhınıza çok iyi bakın! 🌼
Henüz yorum yok. İlk yorumu sen yap!

