OWASP Top 10: Her geliştiricinin bilmesi gereken web güvenlik açıkları
OWASP Top 10, tanınmış, kâr amacı gütmeyen bir güvenlik topluluğu tarafından düzenli olarak güncellenen ve gerçek web uygulamalarında bulunan en yaygın ve en etkili güvenlik açıklarını içeren bir listedir. Soyut, akademik bir liste değildir; canlı ortamdaki yazılımlarda nelerin sürekli bozulduğuna dair gerçek verilerden derlenir. Web uygulamaları geliştiriyor ya da yayına alıyorsanız, bir kez göz gezdirip geçmek yerine gerçekten anlamaya değer temel liste budur.
Bu liste neden genel bir “güvenli olun” kontrol listesinden daha önemli?
Güvenlik tavsiyeleri çoğu zaman harekete geçmek için fazla belirsizdir. OWASP Top 10'u faydalı kılan tam olarak somut olmasıdır: Her kategori, köklü çözümleri olan, gerçek ve iyi anlaşılmış bir hata sınıfını tanımlar. Kategorilerin pratikte gerçekte ne anlama geldiğini sade bir dille anlatalım.
Sade bir dille kategoriler
Bozuk erişim kontrolü (Broken Access Control)
Bir kullanıcının yapmaması ya da görmemesi gereken bir şeyi yapabildiği durumdur: URL'deki bir ID'yi değiştirerek başka bir kullanıcının verilerini görmek ya da yönetici yetkisi olmadan bir yönetici sayfasına ulaşmak gibi. Gerçek dünyada sürekli olarak en sık karşılaşılan bulgulardan biridir; çünkü erişim kontrollerinin her bir rotada ve her bir işlemde doğru şekilde uygulanması gerekir ve gerçek bir açık oluşturmak için tek bir atlanmış kontrol yeterlidir.
Kriptografik hatalar (Cryptographic Failures)
Hassas verilerin — şifreler, ödeme bilgileri, kişisel bilgiler — gerekli koruma olmadan saklanması ya da iletilmesi. Buna şifrelerin düz metin olarak ya da zayıf hash yöntemleriyle saklanması ve hassas verilerin şifrelenmemiş bağlantılar üzerinden gönderilmesi de dâhildir.
Enjeksiyon (Injection)
SQL enjeksiyonunun da ait olduğu geniş kategoridir: Güvenilmeyen girdinin veri olarak değil komut olarak yorumlandığı her durum; bu ister bir veritabanı sorgusu, ister bir sistem komutu, isterse uygulamanın kullanıcı adına çalıştırdığı başka bir şey olsun.
Güvensiz tasarım (Insecure Design)
Bazı güvenlik açıkları hiç de uygulama hatası değildir; kimliği doğru şekilde doğrulamayan bir şifre sıfırlama akışı gibi, baştan güvenlik düşünülmeden tasarlanmış bir özelliğin doğrudan sonucudur. Bu kategori, güvenliğin kod yazıldıktan sonra yapılan bir kontrol turu değil, tasarım konuşmasının bir parçası olması gerektiğini hatırlatır.
Güvenlik yapılandırma hataları (Security Misconfiguration)
Hiç değiştirilmemiş varsayılan yönetici şifreleri, gereksiz yere açık bırakılmış özellikler, her ziyaretçiye iç sistem bilgilerini sızdıran aşırı ayrıntılı hata mesajları. Çoğu zaman düzeltmesi en kolay ve gözden kaçırması en kolay kategoridir; çünkü hiçbiri yeni kod yazmayı gerektirmez.
Güvenlik açığı bulunan ve güncel olmayan bileşenler (Vulnerable and Outdated Components)
Bilinen ve kamuoyuna açıklanmış bir güvenlik açığı bulunan bir kütüphane, framework ya da bağımlılık kullanmak. Modern uygulamalar, her biri yamalanmadan bırakıldığında gerçek bir risk yaratabilecek onlarca ya da yüzlerce üçüncü taraf paketi kullandıkça bu durum daha yaygın hâle geldi.
Kimlik tanımlama ve doğrulama hataları (Identification and Authentication Failures)
Zayıf şifre gereksinimleri, tekrarlanan giriş denemelerine karşı koruma olmaması, düzgün şekilde sona ermeyen ya da geçersiz kılınmayan oturum yönetimi. Çok faktörlü kimlik doğrulamayı bu kadar anlamlı bir iyileştirme yapan kategori budur: Diğer parçalar sessizce ters gittiğinde bile girişin kendisini korur.
Yazılım ve veri bütünlüğü hataları (Software and Data Integrity Failures)
Düzgün şekilde doğrulanmamış bir kaynaktan gelen verilere ya da koda güvenmek. Örneğin yüklediği şeyin gerçekten iddia ettiği şey olduğunu teyit etmeyen bir güncelleme mekanizması ya da CI/CD hattı.
Güvenlik loglama ve izleme hataları (Security Logging and Monitoring Failures)
Düzgün bir loglama olmadan bir veri ihlali uzun süre fark edilmeyebilir; fark edildikten sonra bile tam olarak ne olduğunu anlamak için hiçbir kayıt bulunmaz. İyi bir loglama bir saldırıyı önlemez, ama biri fark edene kadar saldırının ne kadar zarar verebileceğini ciddi şekilde sınırlar.
Sunucu taraflı istek sahteciliği (Server-Side Request Forgery)
Bir sunucuyu, erişimi olmaması gereken bir hedefe — çoğu zaman genel internetten doğrudan erişilemeyen bir iç sisteme — istek göndermesi için kandırmak.
Bu listeyle gerçekte ne yapmalısınız?
Onu çalışılacak bir sınav gibi görmeyin. Kendi kod tabanınız için gerçek bir kontrol listesi olarak ele alın: Her kategori için, “Modern bir framework kullandığımız için muhtemelen sorun yoktur” demek yerine uygulamanızın özellikle bu kategoriye karşı kontrol edilip edilmediğini dürüstçe sorun. Framework'ler yardımcı olur, ama sizi tasarım kararlarından, yapılandırma hatalarından ya da birinin teslim tarihi baskısı altında yazdığı tek bir ham sorgudan tamamen korumaz.
Tam olarak bu listeye göre yapılandırılmış bir inceleme — genel bir tarama değil, sizin kodunuzun ve yapılandırmanızın gerçek bir incelemesi — altyapı sıkılaştırma ve ekipleri gerçek bir uyumluluk denetimine hazırlamanın yanı sıra Burncode'un uygulama güvenliği çalışmalarının bel kemiğini oluşturur.