Bloga dön

ASP.NET Core MVC Uygulamasını Güvenli Hale Getirmek

04 Şubat 2025

ASP.NET Core MVC Uygulamasını Güvenli Hale Getirmek (Gerçek Dünya Yaklaşımı)

Giriş

Güvenlik, çoğu öğrenci ve erken aşama projede genellikle sonradan düşünülen bir konu olur. Ancak gerçek dünya uygulamalarında küçük açıklar bile veri sızıntısı, yetkisiz erişim veya sistemin ele geçirilmesi gibi ciddi problemlere yol açabilir.

Bu yazıda, ASP.NET Core MVC uygulamamı gerçek güvenlik açıklarını tespit ederek ve production seviyesinde çözümler uygulayarak nasıl güvenli hale getirdiğimi anlatacağım.

Problem

Projem başlangıçta çalışıyordu ancak ciddi güvenlik zafiyetleri vardı:

  • Bazı admin işlemleri herkese açıktı
  • Silme işlemleri HTTP GET ile yapılıyordu
  • Parolalar düz metin olarak saklanıyordu
  • Kullanıcı girdileri Html.Raw() ile render ediliyordu
  • Dosya yükleme işlemlerinde doğrulama yoktu
  • Formlarda CSRF koruması yoktu

Bunlar yaygın hatalar olsa da aynı zamanda ciddi risklerdir.

Neler Yaptım

1. Yetkilendirme ve Erişim Kontrolü

Hassas endpoint’leri korumak için:

[Authorize]

kullandım.

Public olması gereken sayfalar için:

[AllowAnonymous]

kullandım.

Sonuç: Sadece giriş yapmış kullanıcılar admin işlemlerine erişebilir.

2. Güvenli Parola Yönetimi

Düz metin parola yerine:

IPasswordHasher<AdminUser>

kullandım.

  • Parolalar artık hash’lenerek saklanıyor
  • Eski (plaintext) parolalar giriş sırasında otomatik güncelleniyor

Sonuç: Veritabanı sızsa bile parolalar doğrudan ele geçirilemez.

3. CSRF Koruması (Antiforgery)

Tüm state-changing işlemlere:

[ValidateAntiForgeryToken]

ekledim.

Formlara otomatik antiforgery token eklendi.

Sonuç: Cross-site request forgery saldırıları engellendi.

4. Tehlikeli DELETE İşlemlerinin Düzeltilmesi

Önce: GET /Delete/5

Sonra: POST /Delete/5

Sonuç: Link veya script ile yanlışlıkla veri silinmesi engellendi.

5. XSS (Cross-Site Scripting) Önleme

Önce: @Html.Raw(Model.Content)

Şimdi:

  • İçerik güvenli şekilde encode ediliyor
  • Sadece satır sonları korunuyor

Sonuç: Kullanıcı girdisi artık tarayıcıda JavaScript çalıştıramaz.

6. Güvenli Dosya Yükleme

Şu kontrolleri ekledim:

  • İzin verilen uzantılar (.jpg, .png vb.)
  • MIME type kontrolü
  • Dosya boyutu limiti
  • Güvenli dosya isimlendirme

Sonuç: Zararlı dosyaların sisteme yüklenmesi engellendi.

7. Girdi Doğrulama (Validation)

Server-side validation ekledim:

[Required] [StringLength(200)] [EmailAddress]

Sonuç: Daha temiz veri ve daha küçük saldırı yüzeyi.

Ek Production İyileştirmeleri

Temel güvenliğin dışında şunları da ekledim:

Database dayanıklılığı: EnableRetryOnFailure()

Health check endpoint: GET /health

Structured logging: _logger.LogInformation("User logged in: ", username);

Bu iyileştirmeler sistemi production ortamında daha stabil ve izlenebilir hale getirir.

Önemli Çıkarımlar

  • Güvenlik küçük projelerde bile zorunludur
  • Çoğu açık basit hatalardan kaynaklanır
  • ASP.NET Core güçlü araçlar sunar — kullan
  • Kullanıcı girdisine asla güvenme
  • Sistem tasarlarken saldırgan gibi düşün

Sonuç

Bu süreç, projemi basit çalışan bir uygulamadan production’a daha yakın bir sisteme dönüştürdü.

Daha önemlisi, yazılım bakış açımı değiştirdi:

Sadece “Çalışıyor mu?” değil “Ama güvenli mi, sağlam mı, sürdürülebilir mi?”

Final Not

ASP.NET Core uygulaması geliştiriyorsan güvenliği sona bırakma. Baştan düşün, gerçek açıkları kapat ve projeni gerçek bir sistem gibi geliştir.

Link kopyalandı