Hoşgeldin Misafir

Java ile Güvenli Kodlama: OWASP Standartlarına Uygun Geliştirme 2

Stronger_Cracker

25 Tem 2022
6,408 Mesaj

Aktiflik

Seviye

Deneyim

TIM / GÖREV:
🔷 Java ile Güvenli Kodlama ve OWASP Bakış Açısı

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.

Java ile Güvenli Kodlama: OWASP Standartlarına Uygun Geliştirme



▸ 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, :param gibi placeholder kullanımından asla vazgeçmeyin.

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.

Java ile Güvenli Kodlama: OWASP Standartlarına Uygun Geliştirme


▸ 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.