XSS di tahun 2026: masih hidup, masih berbahaya
Framework modern meng-escape otomatis, tapi XSS tidak mati. Ia hanya pindah ke tempat yang lebih licik: atribut, URL, dan konten yang dipercaya mentah.
Kenapa masih ada
React, Vue, dan kawan-kawan meng-escape teks secara default. Ini menaikkan lantai keamanan secara dramatis. Tapi aplikasi web tidak hanya terdiri dari teks: ada href, ada dangerouslySetInnerHTML, ada render markdown, ada integrasi pihak ketiga.
XSS hari ini jarang berupa tag script polos. Ia bersembunyi di javascript: URL, di atribut event, di JSON yang diinjeksi ke halaman, dan di sanitasi yang salah konfigurasi.
Tiga kesalahan yang paling sering saya temui
Pola-polanya konsisten di banyak proyek.
- Memercayai input dari API sendiri. Data dari database pun bisa tercemar bila pernah masuk tanpa validasi.
- Sanitasi di tempat yang salah. Escape harus terjadi saat keluaran dirender, bukan saat masukan disimpan.
- Merender HTML pengguna untuk fitur komentar atau profil tanpa sanitasi ketat, atau dengan sanitizer yang diizinkan tag berbahaya.
Lapisan pertahanan yang masuk akal
Pertama, default framework: jangan bypass escape tanpa alasan yang bisa kamu pertanggungjawabkan. Kedua, CSP yang ketat memangkas dampak XSS yang lolos: tanpa inline script, eksploitasi kehilangan giginya. Ketiga, cookie penting dengan HttpOnly dan SameSite supaya pencurian session tidak trivial.
Dan uji sendiri. Masukkan payload standar ke setiap form yang kamu buat sebelum orang lain melakukannya untukmu.