Patching Stored Cross-Site Scripting (XSS) melibatkan tiga langkah utama: implementasi context-aware output encoding, validasi ketat pada sisi server untuk setiap input yang masuk, serta penerapan kebijakan keamanan seperti Content Security Policy (CSP). Stored XSS terjadi ketika aplikasi menyimpan input pengguna yang tidak disterilisasi ke dalam basis data dan kemudian merendernya ke browser pengguna lain tanpa proteksi yang memadai.
Untuk menambal celah ini secara tuntas, pengembang tidak boleh hanya mengandalkan filter pada sisi klien (frontend). Seluruh mitigasi wajib berpusat di sisi server (backend) guna mencegah eksekusi skrip berbahaya secara permanen.
Langkah Teknis Penanganan Stored XSS
1. Context-Aware Output Encoding
Encoding mengubah karakter khusus (seperti <, >, &, ", dan ') menjadi entitas HTML yang aman sehingga browser memperlakukannya sebagai teks murni, bukan sebagai kode eksekutable.
// Contoh Implementasi Aman di Node.js menggunakan DOMPurify atau escape-html
const escape = require('escape-html');
function renderComment(userInput) {
// Melakukan escape sebelum merender ke DOM atau HTML response
const safeOutput = escape(userInput);
return `<div>${safeOutput}</div>`;
}
2. Validasi dan Sanitasi Input Sisi Server
Terapkan pendekatan allowlist (daftar putih) untuk menerima karakter yang diizinkan saja. Jika input memerlukan format HTML kaya (seperti teks editor), gunakan pustaka pembersih tepercaya seperti DOMPurify atau Bleach untuk membuang tag berbahaya (seperti <script>, <object>, atau atribut onerror).
3. Implementasi Content Security Policy (CSP)
CSP bertindak sebagai benteng pertahanan terakhir (defense-in-depth) di browser. Header HTTP ini membatasi sumber daya mana saja yang diizinkan untuk dimuat dan dieksekusi oleh peramban.
Content-Security-Policy: default-src 'self'; script-src 'self' https://trustedscripts.example.com; object-src 'none';
Matriks Komprehensif Teknik Mitigasi Stored XSS
| Strategi Patching | Lokasi Eksekusi | Tingkat Keamanan | Fungsi Utama |
|---|---|---|---|
| Output Encoding | Sisi Server (Rendering) | Tinggi | Mencegah browser mengeksekusi karakter spesial sebagai skrip. |
| HTML Sanitization | Sisi Server (Sebelum DB) | Menengah-Tinggi | Membersihkan tag berbahaya sambil mempertahankan format HTML aman. |
| HttpOnly Cookies | Konfigurasi Server / Session | Tinggi (Mitigasi Dampak) | Mencegah skrip XSS mencuri cookie sesi melalui document.cookie. |
| Content Security Policy | Header HTTP Browser | Tinggi | Memblokir eksekusi skrip inline dan sumber eksternal tidak dikenal. |
Langkah Pengujian Pasca-Patch (Verification)
Setelah menerapkan kode perbaikan, lakukan pengujian verifikasi untuk memastikan kerentanan benar-benar tertutup:
- Masukkan payload uji standar seperti
<script>alert(1)</script>pada kolom input yang rentan (misalnya kolom komentar atau profil pengguna). - Simpan data dan muat ulang halaman menggunakan akun atau peramban yang berbeda.
- Periksa apakah string tersebut tampil sebagai teks biasa pada halaman web atau dieksekusi sebagai pop-up oleh browser.
- Pastikan pula bahwa sumber HTML halaman menampilkan entitas terenkripsi seperti
<script>.
Troubleshooting Kendala Patching di Lapangan
Beberapa kendala umum yang sering ditemui pengembang saat melakukan patching meliputi:
- Double Encoding: Terjadi ketika data di-encode dua kali oleh server dan database, menyebabkan karakter khusus tampil rusak di antarmuka pengguna. Solusinya, lakukan encoding hanya sekali tepat sebelum data dirender ke HTML.
- Fungsionalitas Rich Text Rusak: Penggunaan sanitasi yang terlalu ketat dapat menghapus elemen format teks seperti
<b>atau<i>. Atur konfigurasi pustaka sanitasi agar hanya mengizinkan tag yang benar-benar dibutuhkan aplikasi.