Dalam dunia pengembangan web modern, keamanan menjadi salah satu aspek paling penting yang tidak boleh diabaikan. Banyak developer berfokus pada performa dan tampilan antarmuka, namun lupa bahwa celah keamanan kecil bisa berdampak besar pada data pengguna dan reputasi aplikasi. Salah satu ancaman yang paling umum dan berbahaya di sisi frontend adalah Cross-Site Scripting (XSS) — serangan yang memanfaatkan celah pada kode JavaScript untuk menyisipkan skrip berbahaya. Penerapan best practice dan keamanan dasar di JavaScript yang baik bukan hanya tanggung jawab backend, tetapi juga frontend developer. Karena JavaScript berinteraksi langsung dengan DOM dan input pengguna, kesalahan kecil seperti menampilkan data tanpa validasi bisa membuka peluang bagi penyerang untuk menyusupkan kode jahat. Oleh karena itu, memahami prinsip best practice dan teknik pencegahan XSS menjadi langkah penting untuk menjaga aplikasi tetap aman dan profesional.
Apa Itu XSS dan Bagaimana Terjadi?
Cross-Site Scripting (XSS) adalah teknik serangan di mana penyerang menyisipkan skrip berbahaya ke dalam halaman web yang ditampilkan kepada pengguna lain. Tujuannya bisa bervariasi: mencuri cookie pengguna, menampilkan konten palsu, atau bahkan mengambil kendali atas sesi pengguna.
XSS biasanya terjadi ketika aplikasi menampilkan data pengguna tanpa melakukan penyaringan atau escaping karakter berbahaya. Misalnya:
// Contoh raw HTML rendering berbahaya
const name = "<script>alert('XSS!')</script>";
document.getElementById('greeting').innerHTML = `Hello, ${name}`;
Kode di atas akan menjalankan JavaScript dari input pengguna — membuka pintu bagi serangan XSS.
Jenis-Jenis Serangan XSS
-
Stored XSS
Skrip berbahaya disimpan di database, lalu dijalankan ketika halaman dimuat oleh pengguna lain.
Contoh: komentar pengguna yang menyisipkan tag<script>. -
Reflected XSS
Serangan dikirim melalui URL atau form input, lalu langsung ditampilkan di halaman tanpa filter.
Contoh: parameter URL yang disisipkan ke DOM tanpa sanitasi. -
DOM-based XSS
Terjadi di sisi frontend, ketika manipulasi DOM menggunakan JavaScript memungkinkan injeksi skrip dari input atau URL tanpa sanitasi.
Contoh:document.body.innerHTML = location.hash.substring(1);
Best Practice untuk Mencegah XSS di JavaScript
1. Gunakan textContent atau innerText Alih-alih innerHTML
Menggunakan innerHTML membuka celah XSS karena mengeksekusi HTML mentah. Gunakan textContent untuk menampilkan teks tanpa mengeksekusi tag HTML.
// Aman element.textContent = userInput;
2. Escape Data Sebelum Menampilkan di HTML
Jika kamu perlu menyisipkan data ke dalam HTML, pastikan karakter berbahaya seperti <, >, &, dan " di-escape.
Gunakan fungsi helper:
function escapeHTML(str) {
return str.replace(/[&<>"']/g, (tag) => ({
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": '''
}[tag]));
}
3. Hindari Menjalankan Kode dari Input Menggunakan eval()
Fungsi eval() atau new Function() bisa menjalankan kode apa pun, termasuk skrip berbahaya.
Hindari sepenuhnya.
4. Gunakan Content Security Policy (CSP)
Tambahkan header HTTP berikut pada server:
Content-Security-Policy: default-src 'self';
CSP membantu mencegah eksekusi skrip dari sumber tak dikenal, sehingga serangan XSS sulit dilakukan.
5. Validasi Input dan Encode Output
Validasi data pada sisi client dan server. Jangan hanya memfilter di frontend — gunakan juga sanitasi di backend.
Gunakan whitelist daripada blacklist untuk input yang diizinkan.
6. Gunakan Library Sanitasi
Gunakan library seperti:
-
DOMPurify → membersihkan HTML dari tag dan atribut berbahaya.
-
xss-clean (untuk Node.js) → menyaring input sebelum disimpan ke database.
Contoh penggunaan DOMPurify:
const clean = DOMPurify.sanitize(userInput); element.innerHTML = clean;
7. Hindari Inline JavaScript
Gunakan event listener daripada menulis skrip langsung di atribut HTML seperti onclick:
<!-- Hindari -->
<button onclick="dangerousCode()">Klik</button>
<!-- Gunakan -->
<button id="btn">Klik</button>
<script>
document.getElementById('btn').addEventListener('click', safeHandler);
</script>
Strategi Keamanan Tambahan di Frontend
Selain pencegahan XSS, penting juga menerapkan langkah keamanan tambahan:
-
Gunakan HTTPS agar data tidak bisa disadap.
-
Hindari menyimpan data sensitif (token, password) di
localStorage. -
Gunakan linting tool seperti ESLint dengan aturan keamanan.
-
Audit dependensi npm menggunakan
npm auditsecara rutin.
Kesimpulan
Keamanan JavaScript adalah fondasi penting dalam pengembangan web modern. Ancaman seperti XSS dapat menghancurkan reputasi aplikasi jika tidak diantisipasi dengan benar. Dengan mengikuti best practice seperti menggunakan textContent, menerapkan CSP, dan memanfaatkan library seperti DOMPurify, kamu bisa menjaga aplikasi tetap aman dan tangguh.
Ingat, keamanan bukan fitur tambahan — tetapi bagian inti dari desain aplikasi yang baik. Dengan pemahaman yang kuat dan disiplin menerapkan secure coding, kamu bisa memastikan pengguna dan data mereka selalu terlindungi dari serangan berbahaya.