Web Güvenliğinin Anayasası: OWASP Top 10 Nedir?
Yazılım dünyasında bir uygulamanın başarısı artık sadece sunduğu özelliklerle değil, kullanıcı verisini ne kadar koruyabildiğiyle ölçülüyor. Siber saldırıların sofistike hale geldiği günümüzde, güvenliği projenin sonuna eklenen bir "eklenti" değil, temel bir mühendislik disiplini olarak ele almalıyız. Bu disiplinin küresel otoritesi ise OWASP'tır.
1. OWASP Nedir? Neden Takip Etmelisiniz?
OWASP (Open Web Application Security Project); 2001 yılında kurulmuş, kar amacı gütmeyen küresel bir topluluktur. Temel amacı, yazılım güvenliğini "görünür" kılmaktır.
- OWASP Top 10: Bu liste, dünya genelindeki binlerce zafiyet raporunun analiz edilmesiyle oluşturulur. Bir geliştirici için bu liste, "en çok nereden darbe alabilirim?" sorusunun yanıtıdır.
2. Kritik Riskler
1. A01:2021 – Injection (Enjeksiyon)
SQL Injection, saldırganın girdi alanlarını manipüle ederek veritabanında yetkisiz komut çalıştırmasıdır. Bu sadece veri sızıntısına değil, tüm veritabanının silinmesine yol açabilir.
Yanlış (SQL): string sql = "SELECT * FROM Users WHERE Email = '" + email + "'";
Doğru (EF Core): LINQ sorguları arka planda otomatik olarak parametreleştirilir, bu yüzden EF Core kullanmak sizi büyük oranda korur.
var user = _context.Users.Where(u => u.Email == email).FirstOrDefault();
Doğru (Dapper): Dapper kullanırken mutlaka anonim nesne ile parametre geçilmelidir:
db.Query<User>("SELECT * FROM Users WHERE Email = @email", new { email });
2. A02:2021 – Broken Authentication (Bozuk Kimlik Doğrulama)
Zayıf parola politikaları veya güvenli olmayan session yönetimi, saldırganların kullanıcı hesaplarını ele geçirmesine neden olur.
Savunma Hattı: Şifreleri asla MD5 veya SHA1 gibi artık "kırılmış" algoritmalarla saklamayın. .NET tarafında BCrypt.Net-Next kullanarak "Salt" (tuzlama) işlemi yapın:
string passwordHash = BCrypt.Net.BCrypt.HashPassword(plainPassword);
Ayrıca JWT kullanıyorsanız, SecretKey değerini asla kodun içinde bırakmayın.
3. A03:2021 – Cryptographic Failures (Hassas Veri İfşası)
Kredi kartı bilgileri, TC kimlik numaraları gibi verilerin veritabanında şifrelenmeden tutulmasıdır.
C# Çözümü: .NET'in yerleşik Data Protection API'ını kullanarak hassas kolonları şifreleyin. SQL Server tarafında ise Always Encrypted özelliğinden faydalanarak verinin diskte her zaman şifreli kalmasını sağlayın.
4. A04:2021 – Insecure Design (Güvensiz Tasarım)
Kod hatasından ziyade mantık hatasıdır. Örneğin; bir kullanıcının sepetindeki ürünün fiyatını hidden input ile gönderip backend'de kontrol etmeden ödeme alması.
Strateji: Kullanıcıdan gelen "fiyat", "rol" veya "indirim oranı" gibi verilere asla güvenmeyin. Bu verileri her zaman veritabanındaki (Source of Truth) karşılığı ile backend tarafında doğrulayın.
5. A05:2021 – Security Misconfiguration (Hatalı Yapılandırma)
Sistemin varsayılan ayarlarda bırakılmasıdır. Özellikle canlı ortamda (Production) kullanıcıya sunulan hata detayları (Stack Trace), saldırgana sistem mimarisi hakkında altın değerinde bilgi verir.
Program.cs Yapılandırması:
if (!app.Environment.IsDevelopment()) {
app.UseExceptionHandler("/Error");
app.UseHsts(); // Sadece HTTPS zorunluluğu
}
6. A06:2021 – Vulnerable and Outdated Components
Projedeki NuGet paketlerinin eski sürümlerindeki bilinen açıklar, uygulamanızın "arka kapısı" haline gelebilir.
Aksiyon: Proje dizininde şu komutu düzenli olarak çalıştırın ve riskli paketleri güncelleyin:
dotnet list package --vulnerable
7. A07:2021 – Identification and Authentication Failures
Saldırganın binlerce şifre denemesine (Brute Force) izin verilmesi veya "parolamı unuttum" adımlarındaki zayıflıklardır.
Çözüm (ASP.NET Core 8.0+): Yerleşik Rate Limiting (Hız Sınırı) kullanarak giriş denemelerini kısıtlayın:
options.AddFixedWindowLimiter("loginPolicy", opt => {
opt.PermitLimit = 5; // 1 dakika içinde max 5 deneme
opt.Window = TimeSpan.FromMinutes(1);
});
8. A08:2021 – Software and Data Integrity Failures
Güvensiz nesne serileştirme (deserialization) işlemleri. Kullanıcıdan gelen bir JSON verisinin, sunucu tarafında objeye dönüştürülürken kötü niyetli kod çalıştırması riskidir.
Kritik Uyarı: Newtonsoft.Json kullanıyorsanız TypeNameHandling özelliğini asla All yapmayın. Mümkünse varsayılan olarak daha güvenli olan System.Text.Json kütüphanesini tercih edin.
9. A09:2021 – Security Logging and Monitoring Failures
Bir saldırı girişimi olduğunda log tutulmaması, müdahale şansını ortadan kaldırır. Sadece Exception loglamak yetmez.
Doğru Loglama: Kritik işlemleri (başarısız login, yetki yükseltme talebi, şifre sıfırlama) Serilog gibi araçlarla merkezi bir yere (Azure Monitor, ELK Stack) kaydedin.
_logger.LogWarning("Kritik İşlem: Kullanıcı {Email} yanlış şifre denemesi yaptı.", email);
10. A10:2021 – Server-Side Request Forgery (SSRF)
Sunucunun, saldırgan tarafından verilen bir URL'ye (iç ağdaki bir IP veya servis) istek atması sağlanarak iç ağın taranmasıdır.
Savunma Hattı: Eğer uygulamanız dışarıdan aldığı bir URL'ye HttpClient ile istek atıyorsa, bu URL'yi mutlaka "beyaz liste" (Allow-list) kontrolünden geçirin. Her domain'e istek atılmasına izin vermeyin.
Sonuç
Güvenli kod yazmak, projenin sonunda yapılan bir kontrol değil; geliştirme sürecinin (DevSecOps) her aşamasında olması gereken bir alışkanlıktır. OWASP Top 10 standartlarını takip etmek, modern web tehditlerine karşı en güçlü kalkanınızdır.
Kaynak ve Detaylı Dokümantasyon: https://owasp.org/