Cross-Site Scripting (XSS) Zafiyeti ve Güvenli Kodlama
Web uygulamalarında istemci tarafında zararlı kod çalıştırılmasına neden olan XSS açığının türleri ve önleme yöntemleri.
Genel Bakış
Cross-Site Scripting (XSS), saldırganların başka kullanıcıların tarayıcılarında zararlı istemci tarafı (client-side) betikleri (genellikle JavaScript) çalıştırmasına olanak tanıyan kritik bir web güvenliği zafiyetidir. OWASP Top 10 listesinde sürekli olarak üst sıralarda yer alır.
Sorun
Bir web uygulaması, kullanıcıdan aldığı veriyi hiçbir filtreleme (sanitization) veya kodlama (encoding) işlemine tabi tutmadan doğrudan HTML sayfasının içine yazdırıyorsa XSS zafiyeti oluşur. Saldırgan, bir yorum alanına <script>alert(document.cookie)</script> yazdığında, bu yorumu görüntüleyen diğer tüm kullanıcıların tarayıcısı bu kodu bir veri değil, çalıştırılması gereken bir yazılım olarak algılar ve çalıştırır. Sonuç olarak kullanıcıların oturum bilgileri (session cookies) çalınabilir.
Çözüm: Veri Çıkış Kodlaması (Output Encoding)
XSS'i engellemenin en etkili yolu, kullanıcıdan alınan verinin HTML dökümanına render edilmeden önce güvenli karakterlere dönüştürülmesidir (Encoding).
Örnek Encoding (PHP):
// Kötü Kullanım:
echo $_GET['arama'];
// Güvenli Kullanım:
echo htmlspecialchars($_GET['arama'], ENT_QUOTES, 'UTF-8');
Teknik Detaylar
XSS zafiyetleri üçe ayrılır: Stored XSS (Kalıcı): Zararlı kod veritabanına kaydedilir (örneğin forum postu). En tehlikeli olanıdır. Reflected XSS (Yansıyan): Zararlı kod URL parametrelerinde taşınır ve sunucudan hemen geri yansır (örneğin arama sonuç sayfası). DOM-based XSS: Zafiyet sunucuda değil, sayfa yüklendikten sonra çalışan JavaScript kodunun DOM (Document Object Model) manipülasyonu sırasında gerçekleşir. Ek bir güvenlik katmanı olarak HttpOnly cookie bayrağı kullanılarak JavaScript'in çerezlere erişimi engellenmeli ve sunucuda CSP (Content Security Policy) başlıkları yapılandırılmalıdır.
Sonuç
Modern frontend framework'leri (React, Angular, Vue) verileri varsayılan olarak escape (kaçış) işleminden geçirdiği için XSS riskini büyük ölçüde azaltır. Ancak "dangerouslySetInnerHTML" gibi yapıların bilinçsiz kullanımı ve eski tip backend render süreçleri hala bu zafiyete kapı aralamaktadır.