⚔️ 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! 🌼