OWASP Top 10 (2021)
A01: Bozuk Erişim Kontrolü (Broken Access Control)
Kullanıcılar yetkileri dışındaki kaynaklara erişebilir veya başka kullanıcıların verilerini değiştirebilir. 2021'de en sık karşılaşılan güvenlik açığıdır.
Tüm endpoint'lerde sunucu tarafı yetki kontrolü zorunlu kıl. Default-deny politikası uygula. ID'leri tahmin edilemez yap (UUID/GUID). IDOR'a karşı her resource için 'sahibi mi?' kontrolü ekle. Tarayıcıdaki rol kontrolüne asla güvenme.
Yanlış: GET /api/orders/123 — sadece login kontrol ediliyor. Doğru: order.UserId == currentUser.Id veya rol bazlı policy doğrulanıyor.
A02: Kriptografik Hatalar (Cryptographic Failures)
Hassas verilerin (parola, kart, kişisel veri) zayıf veya yanlış şifrelenmesi sızıntı durumunda doğrudan açığa çıkmasına yol açar.
Parolaları bcrypt/argon2/scrypt ile hash'le (asla MD5/SHA1). Her yerde TLS 1.2+ kullan. Hassas alanları uygulama düzeyinde de şifrele. Eski/zayıf algoritmaları (DES, RC4, MD5) yasakla. Anahtarları KMS/Vault'ta tut.
ASP.NET Core: PasswordHasher zaten PBKDF2 kullanır; daha güçlüsü için Argon2id (Konscious.Security.Cryptography.Argon2 paketi) önerilir.
A03: Injection (SQL, NoSQL, OS, LDAP)
Kullanıcı girdisi sorguya doğrudan eklenirse saldırgan veritabanı, dosya sistemi veya komut satırı üzerinden istediği kodu çalıştırabilir.
Her zaman parametreli sorgu/prepared statement kullan. ORM'lerde raw SQL'den kaçın. Şablon motorlarında (HTML, e-posta) auto-escape açık olsun. Komut çağrılarında shell yerine argv listesi geç. Girdi doğrula, çıktı kodla.
EF Core: db.Users.Where(u => u.Email == email) güvenli; FromSqlRaw($"... WHERE email = '{email}'") tehlikeli. Bunun yerine FromSqlInterpolated kullan. A04: Güvensiz Tasarım (Insecure Design)
Güvenlik koda eklenmez, tasarımda başlar. Threat modeling yapılmamış sistemlerde her özellik yeni saldırı yüzeyi açar.
Her yeni özellik için STRIDE/abuse-case analizi yap. Veri sınıflandırması (public/internal/confidential) tanımla. Güvenli varsayılanlar: deny by default, secure by default. Rate limiting ve quota'ları tasarım aşamasında planla.
Şifre sıfırlama tasarlanırken sadece 'token gönder' değil — token TTL'i, tek kullanımlık olması, IP/oran sınırı, eski oturumların geçersizleşmesi planlanmalı.
A05: Güvenlik Yanlış Yapılandırması (Security Misconfiguration)
Default parolalar, açık dizin listeleme, gereksiz HTTP metodları, ayrıntılı hata mesajları — saldırganın işini kolaylaştırır.
Production'da DETAILED_ERRORS kapalı. Default credentials değiştir/sil. Kullanılmayan portları/feature'ları kapat. Security headers ekle: HSTS, X-Content-Type-Options, X-Frame-Options/CSP, Referrer-Policy. CORS dar tanımla.
ASP.NET Core: app.UseHsts(), app.UseHttpsRedirection(); response header'larına Content-Security-Policy ekle; UseDeveloperExceptionPage sadece Development'ta.
A06: Bilinen Açıklı/Eski Bileşenler (Vulnerable & Outdated Components)
Bilinen CVE'si olan paketler kullanılırsa saldırganın hazır exploit'i vardır. Modern uygulamalar yüzlerce transitive bağımlılık taşır.
Dependency scanning otomasyonu (Dependabot, Renovate, npm audit, dotnet list package --vulnerable). SBOM üret. Güncellemeleri küçük ve sık yap; major upgrade'leri planla. Kullanılmayan bağımlılıkları temizle.
GitHub Actions ile dotnet list package --vulnerable --include-transitive komutunu CI'da çalıştır; bulgular > 0 ise build fail.
A07: Kimlik Doğrulama ve Oturum Hataları
Zayıf parola politikası, MFA eksikliği, brute-force koruması yokluğu, session ID'lerin yanlış yönetimi hesap ele geçirmeye yol açar.
MFA'yı varsayılan ya da en az opsiyonel sun. Parola minimum 8+ karakter, common-password listesine karşı kontrol et. Login/register/forgot endpoint'lerine rate limiting koy. Session ID'leri httpOnly+Secure+SameSite=Lax cookie'de tut. Logout'ta session'ı sunucuda invalidate et.
ASP.NET Core Identity'de Lockout aktif (5 başarısız → 15 dk kilit), TwoFactorEnabled kullanıcıya sun, RequireUniqueEmail = true.
A08: Yazılım ve Veri Bütünlüğü Hataları
Doğrulanmamış kaynaktan kütüphane çekmek, imzasız update mekanizması, CI/CD pipeline'ında zayıf izolasyon — supply chain saldırılarını kolaylaştırır.
Bağımlılıkları lock dosyası ile sabitle (package-lock.json, packages.lock.json). NuGet için signed package zorunlu kıl. CI sırlarını GitHub OIDC/Azure Federated Identity ile geçici tut. Imza doğrulamayan webhook'ları reddet.
.csproj'da <RestorePackagesWithLockFile>true</RestorePackagesWithLockFile> ve <RestoreLockedMode>true</RestoreLockedMode>; pipeline yetkileri least-privilege.
A09: Güvenlik Loglama ve İzleme Eksikleri
Saldırının ortalama tespit süresi aylar mertebesinde. Log yoksa veya alarm kurulmamışsa olay yaşandığını bile anlayamazsın.
Login başarı/başarısızlığı, yetki reddi, kritik veri değişimi, admin eylemleri için yapılandırılmış log üret. Hassas veriyi log'a yazma. Logları merkezi sistemde (ELK, Seq, Datadog, CloudWatch) topla. Anormal aktivite için alert tanımla.
Serilog + Seq: login fail için Warning seviyesinde log; aynı IP'den 1 dakikada 10+ failed login → Slack/email alarm.
A10: Sunucu Tarafı İstek Sahteciliği (SSRF)
Sunucu, kullanıcının verdiği URL'e istek atıyorsa saldırgan iç ağ servisleri, cloud metadata endpoint'leri (169.254.169.254) veya admin panel'lere erişebilir.
Kullanıcı URL'lerini whitelist domain'lere kısıtla. DNS rebinding'e karşı IP'yi resolve et ve private/loopback aralıklarını reddet. HTTP istemcisinde redirect takibini kapat veya kontrollü yap. Proxy/firewall ile çıkış trafiğini sınırla.
Webhook delivery / link preview gibi özellikler tipik SSRF kaynağıdır; URL'i fetch etmeden önce IPAddress.Parse ile IsPrivate/IsLoopback kontrolü yap.