Stronger_Cracker
- 25 Tem 2022
- 6,408 Mesaj
Aktiflik
Seviye
Deneyim
Java ekosisteminde güvenlik hâlâ çoğu projede “sonradan eklenen özellik” gibi ele alınıyor, oysa OWASP standartlarını baştan sürece gömmek çok daha ucuz ve etkili. Özellikle OWASP Top 10 ve ASVS (Application Security Verification Standard), Java projelerinde hangi kontrollerin zorunlu olması gerektiğini net biçimde tarif ediyor. Bu yazıda özetle, kurumsal Java uygulamalarında en sık kaçırılan bazı noktaları ve pratik yaklaşımları paylaşmak istiyorum.
▸ Girdi Doğrulama, Encoder Kullanımı ve OWASP ESAPI Mantığı
Java tarafında en kritik konu, girdi doğrulama ve çıktı encode etme ayrımını doğru yapmak. Örneğin web katmanında kullanıcı girdisini doğrudan JSP/Thymeleaf’e basmak yerine, HTML için StringEscapeUtils.escapeHtml4() gibi encoder’lar kullanmak XSS riskini ciddi azaltır. OWASP ESAPI Java kütüphanesi tarih
sel olarak bu işleri standartlaştırmak için tasarlandı; bugün ESAPI kullanmasanız bile aynı prensibi izleyip hedef konteks için (HTML, JS, URL, SQL) uygun encoder’ları seçmeniz gerekiyor.
Validasyon tarafında, Bean Validation (JSR 380) ile @NotNull, @Size, @Pattern gibi anotasyonlar hem REST DTO’larında hem de entity katmanında mutlaka konumlandırılmalı. Ancak OWASP’ın da vurguladığı gibi sadece “söz dizimsel” validasyon yetmez; iş kurallarına yönelik “beyaz liste” yaklaşımını (allowlist) servis katmanında da devam ettirmek şart. Aksi halde, tip olarak geçerli ama iş mantığı açısından zararlı verileri rahatlıkla içeri alırsınız.
▸ SQL Injection, JPA/Hibernate ve Parametrik Sorgular
Günümüzde hâlâ string birleştirerek SQL oluşturan Java kodları görüyorum, bu da OWASP Top 10’daki Injection maddesine direkt davetiye. Eğer JPA/Hibernate kullanıyorsanız, her zaman
Java:
Query q = em.createQuery("
SELECT u FROM User u WHERE u.email = :email"); q.setParameter("email", email);
şeklinde parametrik sorgular tercih edilmeli. Native query kullanmanız gerekiyorsa bile ?1,
Ayrıca repository katmanını sıkı bir şekilde soyutlayarak, dinamik sorgu üretimini metot isimleriyle (Spring Data JPA) veya type-safe builder’lar (Criteria API, Querydsl) üzerinden yapmak injection riskini ciddi oranda azaltır. OWASP ASVS’de yer alan “Injection Prevention” gereksinimlerini checklist olarak CI pipeline’ınıza dahil edip, kod review’larda doğrudan bu maddeleri işaretlemek de iyi bir uygulama.
▸ Kimlik Doğrulama, Yetkilendirme ve Güvenli Oturum Yönetimi
Spring Security veya Jakarta Security kullanırken, OWASP’in kimlik doğrulama ve oturum yönetimi rehberlerini baz almak kritik. Parolaları hiçbir koşulda düz metin veya zayıf hash ile (örn. sadece MD5)
saklamamalı; en azından BCryptPasswordEncoder ya da Argon2 tabanlı çözümler kullanılmalı. Ayrıca “account lockout”, “brute force protection”, “password history” gibi politikaları uygulamak için Spring Security’nin event ve filter mekanizmaları kullanılabilir.
Oturum yönetimi tarafında, HttpOnly ve Secure flag’li, SameSite ayarlı cookie’ler artık opsiyon değil, zorunluluk. Özellikle stateless JWT kullanan projelerde, token ömrü, refresh token stratejisi ve token invalidation desenlerini OWASP Cheat Sheet’lerine göre tasarlamak gerekiyor; aksi takdirde tek bir sızan token ile uzun süreli yetki elde edilebiliyor.
▸ Güvenliği Süreçleştirmek: CI/CD, Dependency Management ve Loglama
Sadece kod seviyesinde güvenlik yetmez; OWASP aslında bir “süreç” kültürü de öneriyor. Maven/Gradle projelerinde dependency-check, OWASP Dependency-Track veya Snyk/Trivy benzeri araçlarla bağımlılık zafiyet
lerini CI aşamasında kırmızıya düşürmek oldukça etkili. Buna ek olarak, statik kod analizi (SpotBugs + security plugin, SonarQube) ile OWASP kurallarını build sürecine gömmek, geliştiricinin refleks kazanmasını sağlıyor.
Son olarak, loglama ve denetim izi (audit trail) OWASP ASVS’te net gereksinimlerle tanımlı. Java tarafında SLF4J + Logback ikilisini kullanırken hassas verileri maskelemeden loga basmamak, kimlik doğrulama/ yetkilendirme olaylarını ayrı audit log’larına geçirmek ve bu log’ları merkezi bir SIEM’e aktarmak, özellikle kurumsal Java projelerinde artık standart hâline gelmeli.
