Input Validation ve Sanitization Stratejileri
Modern web uygulamalarında en büyük saldırıların çoğu, basit bir ortak noktaya dayanıyor: kullanıcı girdileri. Eğer uygulamanız “gelen veriyi körü körüne” kabul ediyorsa, SQL Injection, XSS, Command Injection gibi kritik açıkların kapısını kendi ellerinizle açmış oluyorsunuz. Peki bu saldırılar nasıl önlenir? Cevap, input validation (girdi doğrulama) ve sanitization (temizleme) stratejilerinde gizli.
Girdilerin Kontrol Edilmemesinin Riskleri
Modern web uygulamalarında kullanıcıdan gelen veriler, uygulamanın kalbinden geçen damarlar gibidir. Eğer bu veriler kontrol edilmeden sisteme kabul edilirse, tüm uygulama güvenliği bir anda tehlikeye girer. Basit gibi görünen bir form, yanlış kullanıldığında ciddi bir saldırı vektörü hâline gelebilir.
Düşünün:
- E-ticaret sitesi örneği: Kullanıcı bir ürün fiyatı alanına "999 OR 1=1" gibi beklenmedik bir metin giriyor. Eğer sistem bu girdiyi doğrulamadan veritabanına gönderirse, saldırgan veritabanındaki tüm ürün bilgilerini görebilir veya kritik verileri manipüle edebilir. Bu klasik bir SQL Injection riskidir.
- Forum örneği: Bir kullanıcı, kullanıcı adı alanına <script>alert('XSS')</script> gibi bir girdi yolluyor. Eğer sistem bunu filtrelemezse, tüm forum kullanıcılarının tarayıcılarında zararlı JavaScript çalışabilir. Sonuç olarak, kullanıcıların oturum bilgileri çalınabilir, sahte formlar aracılığıyla kimlik bilgileri ele geçirilebilir veya kullanıcılar farkında olmadan başka sayfalara yönlendirilebilir.
- API uç noktası örneği: Bir API normal JSON formatı beklerken, saldırgan kötü niyetli XML gönderiyor. Eğer sistem dış kaynak erişimini kontrol etmiyorsa, XML External Entity (XXE) saldırıları gerçekleşebilir. Bu, sunucunun kritik sistem dosyalarına erişim sağlamasına veya hassas bilgileri sızdırmasına yol açabilir.
💡 Önemli Nokta: Her veri bir potansiyel saldırı vektörüdür. Basit bir metin alanı bile saldırgan için kapıyı aralayabilir.
Kontrol Edilmeyen Girdiler Neden Tehlikeli?
Tüm veriler dışarıdan gelir: Kullanıcı, bot veya başka bir sistem fark etmeden sisteme zarar verebilir.
Uygulama mantığına müdahale edebilir: Yanlış veri, veritabanı sorgularını, API isteklerini veya front-end işleyişini bozabilir.
Güvenlik açıklarını tetikler: SQL Injection, XSS, Command Injection veya XXE gibi saldırılar genellikle kontrolsüz girdilerden doğar.
Girdiyi Güvenilir Hâle Getirmek
Girdiyi güvenilir hâle getirmek, güvenliğin temelidir. Bu, şu adımları içerir:
- Format kontrolü: Girilen verinin beklenen tip ve formatta olup olmadığını kontrol edin. Örneğin, yaş alanına yalnızca sayı kabul edin.
- Uzunluk sınırlaması: Beklenenden uzun girdileri reddedin; aşırı uzun girdiler hem performans hem de güvenlik riski oluşturur.
- Beklenen karakterler: Kullanıcı adı veya şifre gibi alanlarda sadece izin verilen karakterleri kabul edin.
- Şüpheli içerik tespiti: <script>, DROP TABLE, ../ gibi bilinen zararlı kalıpları gözden geçirin.
💡 Mini Tavsiye: Girdiyi kontrol etmek, saldırıyı doğrudan engellemez ama sisteminize zarar verebilecek verilerin içeriye girmesini önler. Bu nedenle, input validation ve sanitization stratejileri bu adımın temelini oluşturur.
Input Validation Nedir, Neden Gereklidir?
Web uygulamalarında kullanıcılar sürekli veri gönderir: form doldurur, yorum yazar, API’yi kullanır. Ancak bu veriler her zaman güvenilir değildir. Kötü niyetli kullanıcılar sisteme zarar verebilecek, veritabanına sızabilecek veya başka kullanıcıları etkileyebilecek veriler gönderebilir. İşte burada input validation devreye girer.
Input validation, gelen verinin “beklediğiniz formatta olup olmadığını kontrol etme” işlemidir. Amaç: veriyi sistem için güvenli hâle getirmek.
Nerelerde Uygulanmalı?
- Formlar: Kullanıcı adı, şifre, e-posta, telefon numarası gibi alanlar.
- API uç noktaları: Gelen JSON veya XML verilerinin beklenen yapıda olduğundan emin olmak.
- Dosya yükleme: Kullanıcının yüklediği dosyanın boyutu, türü ve içeriği doğrulanmalı.
Örnekler:
- Email adresi: user@example.com formatında olmalı.
- Yaş: Sadece sayısal değer içermeli, örneğin 18, 25, 60.
- Tarih: YYYY-MM-DD formatında olmalı, örneğin 2025-09-21.
Neden Önemli?
- Yanlış veya zararlı veri sisteme girerse SQL Injection, XSS, XML External Entity (XXE) gibi saldırılara açık hale gelirsiniz.
- Validation, veriyi doğrudan temizlemez; sadece verinin doğru ve beklenen formatta olup olmadığını kontrol eder.
Somut senaryo:
Bir e-ticaret sitesinde “ürün fiyatı” alanı var. Eğer kullanıcı "999 OR 1=1"
gibi bir şey girerse, veritabanına doğrudan gönderiliyorsa tüm tabloya erişim sağlanabilir.
- Validation: “Sadece sayı kabul edilir” der ve girdi reddedilir → saldırı önlenir.
Başka bir örnek:
Forumda kullanıcı adı alanına <script>alert('XSS')</script>
yazılmış.
- Validation: Bu karakterleri kabul etmiyor → script çalışmaz, diğer kullanıcıların tarayıcısı güvenli kalır.
Özet: Input validation, web güvenliğinin ilk savunma hattıdır. Sisteme gelen veriyi kontrol etmek, saldırganın işe başlamadan oyununu bozmak gibidir.
Whitelist vs Blacklist: Validation Stratejileri
Input validation yaparken aslında iki temel yaklaşım vardır: Blacklist (yasak listesi) ve Whitelist (izin listesi).
1️⃣ Blacklist (Yasak Listesi)
Sisteme gelen verilerden zararlı veya istenmeyen içerikleri engeller. Yani belli karakterleri veya kalıpları reddeder.
Örnek:
- <script> etiketlerini engellemek
- SQL anahtar kelimelerini (“DROP”, “DELETE”) filtrelemek
Sorunları:
-
Saldırganlar her zaman farklı yollar bulabilir. Örneğin
<scr<script>ipt>
veya URL encoding kullanarak filtreyi atlatabilir. - Listeyi sürekli güncel tutmanız gerekir; yeni saldırı yöntemleri eklenmezse açık kalır.
Blacklist önlemeye çalışır, ama tamamen güvenli değildir.
2️⃣ Whitelist (İzin Listesi)
Yalnızca önceden belirlenmiş, güvenli ve beklenen formattaki verileri kabul eder. Yani izin verilen dışında her şey reddedilir.
Örnekler:
- Kullanıcı adı sadece harf ve rakamlardan oluşabilir (a-z, A-Z, 0-9)
- Telefon numarası sadece 10 rakam olmalı
- Tarih sadece YYYY-MM-DD formatında
Avantajları:
- Alanlar belli ve sınırlandırılmış → saldırganın oynayabileceği alan çok dar
- Validation daha kesin ve güvenli
Özet olarak, Whitelist güvenliği baştan sağlar, blacklist genellikle ek bir güvenlik katmanı olarak kullanılır.
💡 Pratik Tavsiye
- Whitelist’i temel strateji olarak kullanın.
- Blacklist’i ek bir kontrol katmanı olarak düşünün.
- Böylece sistem, beklenmeyeni reddeder ve ekstra bir güvenlik kalkanı oluşur.
Regex Kullanımında Güvenlik Riskleri
Regex (Regular Expressions), validation için güçlü bir araçtır. Belirli bir formatı kontrol etmek veya belirli karakterleri kabul etmek için kullanılır. Örneğin bir kullanıcı adının sadece harf ve rakamdan oluşmasını istemek için regex idealdir.
Ancak dikkat edilmezse, regex kendi başına risk oluşturabilir:
1. ReDoS (Regular Expression Denial of Service)
- Çok karmaşık veya hatalı yazılmış regex ifadeleri, saldırganlar tarafından istismar edilebilir.
- Örnek: Saldırgan, regex’in yavaş çalışacağı bir uzun veri göndererek uygulamanın CPU’sunu tüketebilir ve hizmeti yavaşlatabilir.
2. Performans Sorunları
- Karmaşık ve uzun regex ifadeleri, her kullanıcı isteğinde işlenirken sistem kaynaklarını zorlayabilir.
- Özellikle yüksek trafikli uygulamalarda bu, ciddi yavaşlamalara yol açabilir.
3. Yanlış Regex Tanımları
- Eksik veya hatalı tanımlanmış regex, zararlı verilerin sızmasına izin verebilir. Örneğin <script> filtresi sadece düz <script>’i engelliyorsa, saldırgan farklı varyasyonlar kullanabilir
(<scr<script>ipt>)
gibi.
💡 Dikkat Edilmesi Gerekenler
- Regex kullanırken girdi uzunluğunu sınırlayın.
- Çok karmaşık ifadelerden kaçının; mümkünse basit, anlaşılır ve kısa regex’ler tercih edin.
- Regex’in test edilip güvenli olduğundan emin olun; otomatik testlerle çeşitli kötü girdileri deneyin.
Minimal Örnek:
const regex = /^[a-zA-Z0-9]{3,15}$/; // 3-15 karakter arası alfanumerik
console.log(regex.test("normalUser123")
console.log(regex.test("aaaaaaaaaaaa
- Bu örnek, kullanıcı adının sadece belirli bir uzunluk ve karakter aralığında olmasını sağlar.
- Çok karmaşık veya açık bırakılmış regex’ler yerine, bu tür net ve sınırlı ifadeler kullanmak güvenliği artırır.
Output Encoding ve Sanitization Farkları
Web güvenliğinde yalnızca veriyi “kontrol etmek” yetmez; veriyi doğru şekilde işleyip kullanıcıya güvenli bir şekilde sunmak da gerekir. İşte burada sanitization ve output encoding devreye girer.
1. Validation (Girdi Doğrulama / Önleyici Adım)
- Kullanıcının gönderdiği verinin beklenen formata uygun olup olmadığını kontrol eder.
- Amaç, yanlış veya zararlı verinin sisteme girmesini baştan engellemektir.
- Örnek: E-mail alanına sayı veya HTML tag’leri girilirse reddedilir.
2. Sanitization (Temizleme / Düzeltici Adım)
- Girdi sistem tarafından kabul edildiyse, içerisindeki potansiyel zararlı içerikler temizlenir.
- Örnek:
<script>
alert
(1)</script>
gibi bir veri, sadece içerik (alert(1)) bırakılarak script tag’leri kaldırılır. - Sanitization, özellikle kullanıcı girdisinin bir kısmı kabul edilmek zorunda olduğunda kritik önem taşır.
3. Output Encoding (Çıktı Kodlama / Koruyucu Adım)
- Veriyi, çıktıya uygun ve güvenli formatta sunar.
- Örnek:
<script>
alert
(1)</script>
gibi bir veri, HTML sayfasında<script>alert(1)</script>
olarak gösterilir; böylece tarayıcı bunu çalıştırmaz. - Output encoding, XSS gibi saldırıları engellemek için olmazsa olmazdır.
Pratik Örnek:
Kullanıcı <script>
alert
(1)</script>
yazıyor:
- Validation: Format hatalı → reddedilebilir.
- Sanitization: Script tag’i temizlenir → alert(1) kalır.
- Output Encoding: Tarayıcıda güvenli şekilde gösterilir →
<script>alert(1)</script>
Önemli Nokta:
- Validation tek başına yeterli değildir; bypass edilebilir.
- Sanitization, veriyi “düzeltir” ama her zaman tam güvenlik sağlamaz.
- Output encoding, zararlı veriyi “pasifize eder” ve son savunma hattıdır.
- En güvenli yaklaşım: Validation + Sanitization + Output Encoding üçlüsünü birlikte kullanmak.
HTML, JSON, XML Verilerinde Güvenli İşleme
Web uygulamaları genellikle farklı veri formatlarıyla çalışır ve her format kendi güvenlik risklerini taşır. Bu nedenle her çıktıyı doğru şekilde işlemek kritik öneme sahiptir:
- HTML: Kullanıcıdan gelen veriyi doğrudan innerHTML ile sayfaya yazmak XSS saldırılarına davetiye çıkarır. Bunun yerine textContent veya güvenli binding yöntemleri kullanarak, kullanıcı girdisini sadece metin olarak ekleyin. Böylece zararlı scriptlerin çalışmasını engellemiş olursunuz.
- JSON: API veya frontend-backend iletişiminde JSON sık kullanılır. JSON.parse işlemi sırasında, sadece beklenen alanları kabul edin. Fazladan veya beklenmeyen alanları işleme sokmak, saldırganların veri manipülasyonu yapmasına veya hassas bilgilere erişmesine imkan tanıyabilir.
- XML: Eğer uygulamanız XML ile çalışıyorsa, dış kaynaklara erişimi kapatmak çok önemlidir. Aksi halde XML External Entity (XXE) saldırılarıyla sistemde veri sızıntısı veya kritik kaynaklara erişim sağlanabilir.
Örnek (Python ile XML güvenliği):
fromlxml
importetree
parser = etree.XMLParser(resolve_entities=
False)
# Dış kaynak erişimini engelle
xml =
"<data>Test</data>"
tree = etree.fromstring(xml, parser=parser)
print(tree.text)
Bu yöntemlerle, farklı veri formatlarında kullanıcıdan gelen girdileri güvenli şekilde işleyebilir ve olası saldırıları önleyebilirsiniz.
Framework Destekleri
Modern web geliştirme framework’leri, input validation ve sanitization işlemlerini kolaylaştıracak güçlü araçlar sunar. Bu sayede hem kod yazımı hızlanır hem de güvenlik açıkları azaltılır:
- Spring (Java): Spring, özellikle backend uygulamalarda sık kullanılır. @Valid, @NotNull, @Email gibi anotasyonlar sayesinde form veya DTO (Data Transfer Object) seviyesinde veri doğrulaması yapılabilir. Örneğin bir kullanıcı kaydı sırasında e-posta alanının doğru formatta olup olmadığını otomatik kontrol edebilirsiniz.
- Express.js (Node.js): Node.js ekosisteminde Express.js framework’ü için express-validator paketi oldukça popülerdir. Route’lara kolayca validation kuralları ekleyebilir, hatalı girişleri hızlıca yakalayabilirsiniz.
- Django (Python): Django, form ve model yapısıyla validation sürecini entegre bir şekilde sunar. Model alanları için belirlenen türler ve özel validator fonksiyonları, veri tabanına geçmeden önce hatalı veya zararlı veriyi engeller.
⚠️ Unutulmaması gereken nokta: Framework’lerin sunduğu hazır araçlar büyük kolaylık sağlar, fakat uygulamanızın özel ihtiyaçlarına uygun ek validation kuralları eklemeyi ihmal etmeyin. Sadece hazır anotasyon veya kütüphanelere güvenmek, karmaşık veya özel senaryolarda açık bırakabilir.
Yaygın Hatalar ve Bypass Yöntemleri
Input validation ve sanitization süreçlerinde yapılan bazı hatalar, saldırganların kolayca sistemi atlatmasına yol açar. Bu nedenle bu yaygın hataları bilmek ve önlem almak kritik önemdedir:
Sadece istemci tarafında validation yapmak
Birçok geliştirici, kullanıcı deneyimini iyileştirmek için validation işlemlerini yalnızca frontend’de yapar. Ancak bu yeterli değildir. Saldırganlar tarayıcıda veya API isteklerinde POST/GET verilerini değiştirerek validation kontrollerini tamamen atlatabilir.
Öneri: Tüm kritik validation kuralları mutlaka sunucu tarafında da uygulanmalı. İstemci tarafı yalnızca kullanıcıya hızlı geri bildirim vermek için kullanılabilir.
Regex’in eksik veya hatalı tanımlanması
Regex, güçlü bir doğrulama aracıdır ama dikkatli kullanılmazsa bypass edilebilir. Örneğin <script> tag’ini engelleyen bir regex, farklı kodlama veya kaçış karakterleri kullanılarak aşılabilir (<scr<script>ipt>
gibi).
Öneri: Regex ifadelerini dikkatle tasarlayın, örnek testlerle olası bypass senaryolarını kontrol edin. Gerektiğinde ek katmanlar ve whitelist mantığı ile güvenliği artırın.
Sanitization’a tamamen güvenip validation yapmamak
Bazı geliştiriciler “Girdi temizleniyor, sorun yok” yaklaşımını benimser. Oysa sanitization yalnızca zararlı içeriği düzeltir veya çıkarır; format hatalarını engellemez. Örneğin beklenen sayı yerine metin girilirse, sanitization bunu otomatik olarak düzeltmez ve sistemde hataya veya güvenlik açığına yol açabilir.
Öneri: Validation ve sanitization birlikte kullanılmalı; validation önleyici, sanitization düzeltici bir katman olarak görev yapmalıdır.
💡Özet: Bu hataların çoğu, uygulamanın saldırganlara açık hâle gelmesine neden olur. Katmanlı doğrulama, doğru regex kullanımı ve sunucu tarafı kontrolleri ile bu riskler büyük ölçüde azaltılabilir.
Katmanlı Doğrulama Yaklaşımı
Web güvenliğinde tek bir savunma hattı yeterli değildir. Saldırganlar her zaman yeni yollar bulabilir; bu yüzden güvenlik, birden fazla katmanda uygulanmalıdır. Bu yaklaşım, Defense in Depth yani katmanlı savunma olarak bilinir ve modern uygulamalarda en etkili yöntemdir.
İlk Katman: Validation (Girdi Doğrulama)
- Kullanıcının gönderdiği veri, sistem tarafından kabul edilmeden önce format ve içerik açısından kontrol edilir.
- Örnekler: Email formatı, sayı alanları, tarih formatı gibi doğrulamalar.
- Bu adım, yanlış veya zararlı verinin sisteme girmesini engeller. Saldırganın kötü amaçlı kodu doğrudan çalıştırma şansı azalır.
İkinci Katman: Sanitization (Girdiyi Temizleme)
- Validation’dan geçmiş ama hâlâ potansiyel olarak zararlı içerik taşıyan veriler, bu katmanda temizlenir.
- Örnek: <script> tag’leri kaldırılır, özel karakterler escape edilir.
- Bu katman, özellikle beklenmedik veya manipüle edilmiş verilerden kaynaklanabilecek açıkları minimize eder.
Üçüncü Katman: Output Encoding (Çıktıda Güvenlik)
- Sistemden kullanıcıya veri gönderilirken, verinin çıktıya uygun ve güvenli formatta olması sağlanır.
-
Örnek: HTML’de
innerHTML
yerinetextContent
kullanmak, JSON veya XML verilerinde escape işlemleri yapmak. - Bu sayede, herhangi bir zararlı içerik kullanıcı tarafında çalışamaz, XSS gibi saldırılar etkisiz hâle gelir.
Hatırlatma
- Girdiyi kontrol etmezsen, saldırgan sistemin üzerinde kendi kodunu işletir ve ciddi güvenlik açıkları ortaya çıkar.
- Girdiyi kontrol edersen, saldırganın tüm oyun planı baştan bozulur.
Bir Sonraki Adım..
Bir sonraki yazımızda “Kimlik doğrulama ve oturum yönetiminde kritik hatalar” konusuna geçerek, bu katmanlı doğrulama stratejilerini test etmenin yollarını ve otomatikleştirmenin ipuçlarını inceleyeceğiz.
Bir önceki bölüm olan "Web Uygulamalarında Kritik Güvenlik Açıkları" adlı yazımıza ulaşmak için tıklayın..