XSS (Cross-Site Scripting) Nedir? Türleri, Riskleri ve Korunma Yöntemleri
XSS (Cross-Site Scripting), web uygulamalarında güvenilmeyen verilerin uygun güvenlik kontrolleri uygulanmadan bir web sayfasına yerleştirilmesi sonucunda ortaya çıkabilen bir güvenlik açığıdır.
Bu güvenlik sorunu, saldırgan tarafından kontrol edilen içeriğin başka bir kullanıcının tarayıcısında, ilgili web sitesinin güvenlik bağlamında çalışmasına neden olabilir.
XSS açıkları; forumlar, sosyal medya platformları, yorum sistemleri, üyelik sayfaları, arama alanları ve kullanıcıların içerik oluşturabildiği web uygulamalarında görülebilir.
Güvenlik açığının etkisi, uygulamanın yapısına, tarayıcı güvenlik mekanizmalarına ve kullanılan oturum korumalarına bağlı olarak değişir.
Bu rehberde XSS'in ne olduğu, nasıl ortaya çıktığı, türleri, olası zararları ve web uygulamalarında nasıl önlenebileceği anlatılmaktadır.
1. XSS Ne Demektir?
Cross-Site Scripting, Türkçede genellikle siteler arası betik çalıştırma olarak ifade edilir.
XSS, web uygulamasının güvenilmeyen verileri tarayıcı tarafından çalıştırılabilir içerik olarak yorumlanabilecek şekilde işlemesi sonucunda oluşabilir.
Normal şartlarda kullanıcıların yazdığı metinler, web sayfasında yalnızca metin olarak görüntülenmelidir.
Ancak uygulama bu içeriği güvenli biçimde işlemiyorsa tarayıcı, belirli girdileri HTML veya JavaScript olarak yorumlayabilir.
Bu durum web sayfasının davranışını değiştirebilir ve kullanıcı güvenliğini etkileyebilir.
2. XSS Nasıl Ortaya Çıkar?
XSS açıklarının temelinde, güvenilmeyen verilerin web sayfasına yanlış bağlamda yerleştirilmesi bulunur.
Örneğin bir forumda kullanıcıların mesaj yazabildiği bir alan olduğunu düşünelim.
Mesajlar veritabanına kaydedilir ve daha sonra diğer kullanıcılara gösterilir.
Uygulama, mesaj içeriğini HTML olarak güvenli biçimde işlemiyorsa tarayıcı tarafından çalıştırılabilecek istenmeyen içerikler ortaya çıkabilir.
Bu nedenle kullanıcı girdilerinin yalnızca kaydedilmesi değil, görüntülendiği bağlama uygun şekilde işlenmesi de önemlidir.
3. XSS Türleri Nelerdir?
XSS güvenlik açıkları genel olarak üç temel türde incelenir.
|
XSS türü |
Açıklama |
|---|---|
|
Stored XSS |
Zararlı içeriğin uygulamada saklanarak daha sonra kullanıcılara gösterilmesi |
|
Reflected XSS |
İstekle gönderilen içeriğin sunucu yanıtına güvenli olmayan biçimde yansıtılması |
|
DOM-Based XSS |
Tarayıcı tarafındaki JavaScript işlemlerinin güvenilmeyen verileri tehlikeli biçimde kullanması |
Bu sınıflandırmalar her zaman birbirinden tamamen bağımsız değildir. Örneğin saklanan bir veri, tarayıcı tarafındaki güvensiz DOM işlemleri nedeniyle de XSS oluşturabilir.
4. Stored XSS (Kalıcı XSS) Nedir?
Stored XSS, güvenilmeyen içeriğin uygulama tarafından saklanması ve daha sonra kullanıcıların görüntülediği sayfalara güvenli olmayan biçimde eklenmesi sonucunda oluşur.
Örneğin bir forumda kullanıcı mesajları veritabanında saklanır.
Mesaj içerisindeki zararlı içerik yeterli güvenlik kontrolleri olmadan sayfaya yerleştirilirse mesajı görüntüleyen kullanıcılar etkilenebilir.
Stored XSS görülebilecek alanlar:
-
Forum mesajları
-
Blog yorumları
-
Kullanıcı profilleri
-
Ürün değerlendirmeleri
-
Sohbet mesajları
-
Yönetim panellerinde görüntülenen kullanıcı kayıtları
Stored XSS'in önemli özelliklerinden biri, zararlı içeriğin uygulamada saklandığı sürece birden fazla kullanıcıyı etkileyebilmesidir.
5. Reflected XSS (Yansıtılmış XSS) Nedir?
Reflected XSS, bir HTTP isteğinde bulunan güvenilmeyen verinin sunucu tarafından güvenli olmayan biçimde yanıt sayfasına eklenmesiyle ortaya çıkar.
Örneğin bir web sitesindeki arama özelliği, kullanıcının yazdığı kelimeyi sonuç sayfasında görüntüleyebilir.
Arama metni uygun biçimde kodlanmadan HTML içerisine yerleştirilirse XSS riski oluşabilir.
Bu tür güvenlik açıkları özellikle:
-
Arama sonuçları
-
Hata mesajları
-
URL parametreleri
-
Form yanıtları
-
Dinamik sayfa içerikleri
gibi alanlarda görülebilir.
Reflected XSS'te zararlı içerik genellikle uygulamanın veritabanında kalıcı olarak saklanmaz.
6. DOM-Based XSS Nedir?
DOM-Based XSS, tarayıcıda çalışan JavaScript kodunun güvenilmeyen verileri güvenli olmayan yöntemlerle işlemesi sonucunda ortaya çıkar.
DOM (Document Object Model), web sayfasının tarayıcı tarafından temsil edilen yapısıdır.
JavaScript kodları DOM üzerinden sayfa içeriğini değiştirebilir.
Örneğin bir uygulama, URL içerisindeki bir değeri okuyup güvenli olmayan bir yöntemle sayfaya ekliyorsa DOM-Based XSS riski oluşabilir.
Bu tür sorunlarda zararlı veri sunucuya gönderilmeden de tarayıcı tarafında işlenebilir.
7. XSS Güvenlik Açığının Zararları Nelerdir?
XSS açığının etkisi, çalıştırılabilen kodun yeteneklerine ve uygulamanın güvenlik yapılandırmasına bağlıdır.
Olası sonuçlar şunlardır:
-
Web sayfasının içeriğinin değiştirilmesi
-
Kullanıcıya sahte arayüzlerin gösterilmesi
-
Kullanıcı adına yetkisiz işlemler yapılması
-
Sayfadaki hassas bilgilerin okunması
-
Erişilebilir oturum bilgilerinin kötüye kullanılması
-
Kullanıcının farklı işlemlere yönlendirilmesi
-
Uygulamanın güvenilirliğinin zarar görmesi
XSS açığının bulunması, her durumda kullanıcı parolasının veya oturum çerezinin ele geçirilebileceği anlamına gelmez.
Örneğin HttpOnly özelliğiyle korunan çerezler JavaScript tarafından doğrudan okunamaz. Bununla birlikte XSS, kullanıcı oturumu üzerinden gerçekleştirilebilen başka işlemleri etkileyebilir.
8. XSS ile JavaScript Arasındaki İlişki Nedir?
JavaScript, web sayfalarına etkileşimli özellikler kazandıran bir programlama dilidir.
XSS güvenlik açıklarında çoğunlukla tarayıcıda JavaScript çalıştırılması söz konusudur.
Ancak JavaScript kullanılması tek başına güvenlik açığı anlamına gelmez.
Sorun, uygulamanın güvenilmeyen verileri güvenilir uygulama kodundan ayıramamasıdır.
Ayrıca XSS yalnızca doğrudan JavaScript kodu eklenmesiyle sınırlı değildir. HTML ve tarayıcının farklı içerik işleme mekanizmaları da güvenlik açığının oluşmasında rol oynayabilir.
9. XSS Nasıl Önlenir?
XSS'e karşı en önemli savunma, güvenilmeyen verilerin kullanıldıkları bağlama uygun biçimde işlenmesidir.
Başlıca güvenlik önlemleri:
-
Kullanıcı girdileri uygun çıktı kodlamasıyla görüntülenmelidir.
-
HTML içeriğine izin veriliyorsa güvenilir HTML temizleme yöntemleri kullanılmalıdır.
-
Güvenli DOM API'leri tercih edilmelidir.
-
Kullanıcı girdileri doğrudan çalıştırılabilir kod olarak kullanılmamalıdır.
-
URL değerleri ve protokolleri doğrulanmalıdır.
-
Content Security Policy ek koruma olarak uygulanmalıdır.
-
Oturum çerezleri uygun güvenlik özellikleriyle yapılandırılmalıdır.
-
Kullanılan yazılım ve kütüphaneler güncel tutulmalıdır.
-
Güvenlik testleri düzenli olarak gerçekleştirilmelidir.
Tek bir önlem bütün XSS türlerini engellemeye yeterli değildir.
10. Output Encoding (Çıktı Kodlama) Nedir?
Çıktı kodlama, kullanıcıdan alınan verilerin tarayıcı tarafından çalıştırılabilir içerik yerine normal metin olarak yorumlanmasını sağlamaya yardımcı olur.
Örneğin HTML içerisinde özel anlam taşıyan karakterler, metin olarak gösterilmek üzere uygun karakter varlıklarına dönüştürülebilir.
|
Karakter |
HTML karşılığı |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ancak HTML, JavaScript, CSS ve URL bağlamları farklı güvenlik kuralları gerektirir.
Bu nedenle bütün veriler için aynı kodlama yöntemini kullanmak yeterli değildir.
11. JavaScript'te XSS Nasıl Önlenir?
JavaScript ile sayfaya kullanıcı metni eklenirken güvenli DOM özellikleri tercih edilmelidir.
Örneğin:
const mesaj = document.getElementById("mesaj");
const kullaniciMetni = "Merhaba, forum üyeleri!";
mesaj.textContent = kullaniciMetni;
Bu örnekte textContent, verilen değeri normal metin olarak yerleştirir.
Buna karşılık innerHTML, kendisine verilen metni HTML olarak yorumlayabilir.
Bu nedenle güvenilmeyen verilerin doğrudan innerHTML üzerinden eklenmesi XSS riski oluşturabilir.
HTML içeriği eklemek zorunluysa uygun bir HTML temizleme yöntemi kullanılmalıdır.
12. HTML Sanitization Nedir?
HTML Sanitization, HTML içeriğinin güvenlik açısından sakıncalı bölümlerden arındırılması işlemidir.
Özellikle forumlar ve içerik yönetim sistemlerinde kullanıcıların kalın yazı, bağlantı, liste veya görsel gibi biçimlendirmeler kullanmasına izin verilebilir.
Bu durumda bütün HTML etiketlerini metin olarak göstermek istenmeyebilir.
HTML temizleme mekanizmaları, izin verilen biçimlendirmeleri korurken tehlikeli etiketleri ve özellikleri kaldırmaya yardımcı olur.
JavaScript uygulamalarında DOMPurify, bu amaçla kullanılabilen kütüphanelerden biridir.
Örnek:
const temizIcerik = DOMPurify.sanitize(kullaniciIcerigi);
Bu örnek, DOMPurify kütüphanesinin uygulamaya doğru şekilde dahil edildiğini varsayar.
Temizleme işleminin güvenliği kullanılan yapılandırmaya, kütüphane sürümüne ve içeriğin daha sonra nasıl işlendiğine bağlıdır.
13. Content Security Policy (CSP) Nedir?
Content Security Policy, tarayıcının hangi kaynaklardan belirli içerikleri yükleyebileceğini ve hangi kodların çalıştırılabileceğini sınırlandırmaya yardımcı olan bir güvenlik mekanizmasıdır.
CSP, HTTP yanıt başlığı aracılığıyla uygulanabilir.
Örneğin bir web uygulaması, JavaScript dosyalarının hangi kaynaklardan yüklenebileceğini belirleyen kurallar tanımlayabilir.
Doğru yapılandırılmış bir CSP, bazı XSS girişimlerinin etkisini azaltabilir.
Ancak CSP tek başına XSS güvenlik açığını ortadan kaldırmaz.
Temel koruma yine güvenli veri işleme, uygun çıktı kodlama ve HTML temizleme yöntemleridir.
14. HttpOnly, Secure ve SameSite Çerez Özellikleri
Web uygulamalarında kullanılan oturum çerezleri çeşitli güvenlik özellikleriyle korunabilir.
|
Özellik |
Görevi |
|---|---|
|
HttpOnly |
Çerezin JavaScript üzerinden doğrudan okunmasını engeller |
|
Secure |
Çerezin yalnızca güvenli HTTPS bağlantıları üzerinden gönderilmesini sağlar |
|
SameSite |
Çerezlerin siteler arası isteklerde gönderilmesini belirli kurallara göre sınırlar |
Bu özellikler oturum güvenliğini geliştirmeye yardımcı olur.
Ancak hiçbirisi tek başına XSS açığını ortadan kaldırmaz.
15. WordPress Sitelerinde XSS Riski Var mı?
WordPress tabanlı web sitelerinde kullanıcıların içerik oluşturabildiği çeşitli alanlar bulunabilir.
Örneğin:
-
Yorum bölümleri
-
Kullanıcı profilleri
-
Arama alanları
-
İletişim formları
-
Yönetim paneli bileşenleri
-
Eklentiler ve temalar
-
Özel geliştirilmiş içerik alanları
Bu alanlarda güvenilmeyen veriler uygun biçimde işlenmediğinde XSS riski ortaya çıkabilir.
WordPress, güvenli veri işleme amacıyla farklı fonksiyonlar sunar.
Örneğin:
<?php
echo esc_html($kullanici_metni);
Bu kullanım, bir değerin HTML metin bağlamında güvenli biçimde görüntülenmesine yardımcı olur.
HTML özniteliklerinde esc_attr(), URL çıktılarında uygun durumlarda esc_url() kullanılabilir.
İzin verilen HTML etiketlerini koruyarak içerik temizlemek için wp_kses() ve ilgili WordPress fonksiyonlarından yararlanılabilir.
Bu fonksiyonların doğru kullanım bağlamı önemlidir.
16. wpForo Gibi Forum Sistemlerinde XSS Nasıl Önlenir?
Forum sistemleri, kullanıcıların sürekli içerik oluşturduğu platformlardır.
Bu nedenle mesaj editörleri, profil alanları ve özel kullanıcı bilgileri güvenli biçimde işlenmelidir.
Özellikle şu alanlar kontrol edilmelidir:
-
Konu başlıkları
-
Mesaj içerikleri
-
Kullanıcı imzaları
-
Profil açıklamaları
-
Özel unvan alanları
-
Kullanıcı adı görsel efektleri
-
Forum arama sonuçları
-
Özel geliştirilmiş eklenti bileşenleri
Forumda HTML biçimlendirmesine izin veriliyorsa güvenli etiket ve öznitelik kuralları uygulanmalıdır.
Ayrıca özel geliştirilmiş JavaScript kodlarının kullanıcı içeriklerini DOM'a nasıl yerleştirdiği değerlendirilmelidir.
Bir forumda kullanıcıların mesaj yazabiliyor olması, o forumda XSS açığı bulunduğu anlamına gelmez. Güvenlik riski, içeriklerin nasıl işlendiğine bağlıdır.
17. XSS ile SQL Injection Arasındaki Farklar
|
Özellik |
XSS |
SQL Injection |
|---|---|---|
|
Etkilenen bileşen |
Web sayfası ve tarayıcı |
Veritabanı sorguları |
|
Temel sorun |
Güvenilmeyen verinin çalıştırılabilir içerik olarak yorumlanması |
Güvenilmeyen verinin SQL komutunu değiştirebilmesi |
|
Olası etkiler |
Sayfa içeriğinin değiştirilmesi, kullanıcı oturumunun kötüye kullanılması |
Yetkisiz veri erişimi veya veri değişikliği |
|
Temel savunma |
Bağlama uygun çıktı kodlama ve HTML temizleme |
Parametreli sorgular |
|
Test alanı |
Tarayıcı ve web uygulaması |
Uygulama ve veritabanı iletişimi |
İki güvenlik açığı da kullanıcı girdilerinin güvenli olmayan biçimde işlenmesiyle ilişkili olabilir ancak farklı teknik nedenlere ve savunma yöntemlerine sahiptir.
18. XSS Açıkları Nasıl Tespit Edilir?
XSS güvenlik değerlendirmelerinde farklı yöntemlerden yararlanılabilir.
Kaynak kod incelemesi: Kullanıcı girdilerinin hangi işlemlerden geçtiği ve nerede görüntülendiği araştırılır.
Statik analiz: Güvenilmeyen verilerin tehlikeli DOM veya HTML işlemlerine ulaşıp ulaşmadığı incelenir.
Dinamik testler: Uygulamanın çalışma sırasındaki davranışı izinli test ortamlarında değerlendirilir.
Kod inceleme süreçleri: Yeni geliştirilen özelliklerde güvenli çıktı üretimi ve veri işleme kuralları kontrol edilir.
Güvenlik testleri: Web uygulamasındaki giriş alanları, URL parametreleri ve dinamik içerikler test kapsamına alınır.
Otomatik test araçları bazı XSS sorunlarını tespit edebilir. Ancak bütün XSS açıklarının yalnızca otomatik taramayla bulunması garanti değildir.
19. XSS Testlerinde Hangi Araçlar Kullanılır?
|
Araç |
Kullanım amacı |
|---|---|
|
Burp Suite |
HTTP istekleri ve web uygulaması davranışlarının incelenmesi |
|
OWASP ZAP |
Web uygulaması güvenlik testleri |
|
Tarayıcı geliştirici araçları |
DOM yapısı ve JavaScript işlemlerinin incelenmesi |
|
Semgrep |
Kaynak kodda olası güvenlik sorunlarının araştırılması |
|
DOM Invader |
DOM tabanlı güvenlik sorunlarının analizine yardımcı olmak |
Bu araçlar yalnızca test yetkisi bulunan uygulamalarda kullanılmalıdır.
20. XSS Açığı Tespit Edilirse Ne Yapılmalı?
Bir web uygulamasında XSS güvenlik açığı tespit edildiğinde aşağıdaki süreç uygulanabilir:
-
Güvenlik açığının bulunduğu alan belirlenir.
-
İlgili yazılım geliştiricisine veya güvenlik ekibine bildirilir.
-
Etkilenen kullanıcı girdileri ve çıktı bağlamları incelenir.
-
Uygun çıktı kodlama veya HTML temizleme yöntemi uygulanır.
-
Güvensiz DOM işlemleri güvenli alternatiflerle değiştirilir.
-
Gerekli durumlarda CSP ve çerez güvenlik ayarları değerlendirilir.
-
Düzeltmeler test ortamında doğrulanır.
-
Benzer veri işleme noktaları kontrol edilir.
-
Güvenlik kayıtları olası kötüye kullanım açısından incelenir.
-
Düzeltilmiş sürüm yayımlanır.
Saklanan zararlı içerikler bulunuyorsa bunların güvenli biçimde temizlenmesi veya etkisiz hale getirilmesi de gerekebilir.
Sonuç
XSS (Cross-Site Scripting), web uygulamalarının güvenilmeyen verileri tarayıcıda çalıştırılabilir içerik olarak yorumlanabilecek şekilde işlemesi sonucunda ortaya çıkan bir güvenlik açığıdır.
Stored XSS, Reflected XSS ve DOM-Based XSS en yaygın türleridir.
XSS açıkları, web sayfasının değiştirilmesine, kullanıcı bilgilerinin açığa çıkmasına veya kullanıcı oturumu üzerinden yetkisiz işlemler gerçekleştirilmesine neden olabilir.
Bu güvenlik sorununu önlemek için bağlama uygun çıktı kodlama, güvenli HTML temizleme, güvenli DOM API'leri ve ek tarayıcı güvenlik kontrolleri birlikte kullanılmalıdır.
Özellikle forumlar, sosyal medya platformları ve kullanıcı içeriklerinin yoğun olduğu web uygulamalarında güvenilmeyen verilerin doğru işlenmesi büyük önem taşır.






