Best Practice dan Keamanan Dasar (XSS Prevention) di JavaScript

By | 1 November 2025

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

  1. Stored XSS
    Skrip berbahaya disimpan di database, lalu dijalankan ketika halaman dimuat oleh pengguna lain.
    Contoh: komentar pengguna yang menyisipkan tag <script>.

  2. 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.

  3. 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) => ({
    '&': '&amp;',
    '<': '&lt;',
    '>': '&gt;',
    '"': '&quot;',
    "'": '&#39;'
  }[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 audit secara 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.