Güvenli Web Uygulamaları İçin Geliştiricilerin Bilmesi Gereken 7 İlke
Bir web uygulamasının güvenliği, üretime çıktıktan sonra eklenen bir katman değil, geliştirme sürecinin ilk gününden itibaren düşünülmesi gereken bir tasarım ilkesidir. Küçük bir açık bile veri sızıntılarına, itibar kaybına ve ciddi maliyetlere yol açabilir. Bu yazıda modern web uygulamalarında en sık karşılaşılan güvenlik risklerini ve bunlara karşı uygulanabilir savunma yöntemlerini ele alıyoruz.
1. Tüm Girdileri Doğrulayın ve Temizleyin
Kullanıcıdan gelen hiçbir veriye güvenmeyin. Form alanları, URL parametreleri ve API istekleri dâhil tüm girdiler hem istemci hem sunucu tarafında doğrulanmalıdır. İstemci doğrulaması yalnızca kullanıcı deneyimi içindir; asıl güvenlik sunucu tarafı doğrulamada sağlanır.
- Şema tabanlı doğrulama kütüphaneleriyle (örneğin Zod) veri tiplerini garanti altına alın.
- Beklenen değer aralıklarını ve formatları kesin biçimde tanımlayın.
- Reddetme yaklaşımını benimseyin: yalnızca izin verilenleri kabul edin.
2. XSS Saldırılarına Karşı Çıktıyı Koruyun
Cross-Site Scripting (XSS), saldırganın sayfaya zararlı betik enjekte etmesiyle oluşur. React gibi modern framework'ler çıktıyı varsayılan olarak escape ederek büyük koruma sağlar, ancak dangerouslySetInnerHTML gibi kaçış noktaları risk taşır.
Kullanıcı üretimli HTML içeriğini göstermeniz gerekiyorsa, mutlaka güvenilir bir sanitizasyon kütüphanesinden geçirin. Ayrıca Content Security Policy (CSP) başlığı, yetkisiz betiklerin çalışmasını engelleyen güçlü bir ikinci savunma hattıdır.
3. CSRF ve Oturum Güvenliğini Sağlayın
Cross-Site Request Forgery (CSRF), kullanıcının oturumunu kötüye kullanarak istem dışı işlemler yaptırır. Bu saldırıya karşı CSRF token'ları kullanın ve çerezleri SameSite, HttpOnly ve Secure nitelikleriyle koruyun.
- HttpOnly: Çerezin JavaScript ile okunmasını engeller.
- Secure: Çerezin yalnızca HTTPS üzerinden gönderilmesini sağlar.
- SameSite: Çerezin çapraz sitelerden gönderilmesini kısıtlar.
4. Kimlik Doğrulama ve Yetkilendirmeyi Ayırın
Kimlik doğrulama (kullanıcının kim olduğu) ile yetkilendirme (neye erişebileceği) farklı kavramlardır ve ikisi de titizlikle ele alınmalıdır. Her hassas işlemde kullanıcının yetkisini sunucu tarafında yeniden kontrol edin; istemci tarafındaki gizleme güvenlik değildir.
Parolaları asla düz metin saklamayın; güçlü ve yavaş bir hash algoritması (bcrypt, Argon2) kullanın. Mümkün olduğunda çok faktörlü doğrulama sunun ve oturum sürelerini makul tutun.
5. Güvenlik Başlıklarını Yapılandırın
HTTP güvenlik başlıkları, tarayıcı düzeyinde ek koruma sağlar ve çoğu birkaç satırla eklenebilir.
- Strict-Transport-Security: Tarayıcıyı HTTPS kullanmaya zorlar.
- X-Content-Type-Options: MIME tipi tahminini engeller.
- Content-Security-Policy: Kaynakların nereden yükleneceğini kısıtlar.
6. Bağımlılıkları Güncel ve Denetimli Tutun
Modern uygulamalar yüzlerce üçüncü taraf pakete dayanır ve bunların her biri potansiyel bir risktir. Bağımlılıklarınızı düzenli olarak güncelleyin ve otomatik güvenlik denetimi araçlarını (örneğin bağımlılık tarayıcıları) CI sürecinize ekleyin. Bilinen açıkları olan paketleri hızla değiştirin.
7. Sırları ve Yapılandırmayı Koruyun
API anahtarları, veritabanı bilgileri ve token'lar asla kod deposuna girmemelidir. Bunları ortam değişkenleri ve güvenli sır yönetim servisleriyle saklayın. Ayrıca hata mesajlarında sistem detaylarını sızdırmamaya dikkat edin; ayrıntılı hataları yalnızca sunucu günlüklerinde tutun.
Güvenlik, tek seferlik bir görev değil sürekli bir disiplindir. Bu ilkeleri geliştirme sürecinizin doğal bir parçası hâline getirdiğinizde, kullanıcı verilerini korur ve uygulamanızın güvenilirliğini uzun vadede sağlam bir temele oturtursunuz. Güvenli bir uygulama, hem kullanıcılarınıza hem de markanıza duyulan güvenin en somut ifadesidir.