HTML Academy · Pelajaran

XSS melalui innerHTML dan Cara Mencegahnya

Pahami skrip lintas situs dan alternatif yang aman untuk innerHTML.

Pelajaran 2 dari 414 langkah

XSS melalui innerHTML dan Cara Mencegahnya adalah pelajaran HTML Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar HTML Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus HTML Academy mencakup 4 pelajaran total.

Kerentanan Utama

Menetapkan el.innerHTML = userInput akan mengurai teks tersebut sebagai HTML. Jika userInput berisi tag <script> atau atribut penangan peristiwa (onclick, onerror), peramban akan menafsirkannya dan menjalankan kode yang dikendalikan penyerang pada halaman.

Mengapa Ini Umum Terjadi

Setiap kode yang menyisipkan data pengguna ke dalam HTML—templat peladen atau penyusunan tampilan di sisi klien—berisiko menimbulkan XSS jika data tersebut tidak di-escape. Aplikasi satu halaman yang membangun innerHTML dari respons API sangat rentan, terutama ketika respons tersebut berisi konten pengguna.

Contoh Konkret

Nama pengguna "Bob<img src=x onerror=alert(1)>" yang ditetapkan melalui div.innerHTML = `Welcome, ${user}` akan menjalankan alert(1) ketika img gagal dimuat. Muatan yang sama sebagai teks biasa (melalui textContent) tidak berbahaya—peramban hanya melihat karakter, bukan tag.

// VULNERABLE
div.innerHTML = `Hi, ${user.name}`;

// SAFE
div.textContent = `Hi, ${user.name}`;

Gunakan textContent untuk Teks Biasa

textContent hanya menetapkan teks—karakter khusus HTML muncul sebagai karakter literal, bukan sebagai tag. Inilah alat yang tepat dalam 90% kasus. Beralihlah ke innerHTML hanya jika Anda benar-benar perlu menampilkan markup, bukan teks.

Gunakan Metode DOM untuk Struktur

Untuk membuat elemen dengan data pengguna, buat elemen tersebut menggunakan createElement dan textContent: const li = document.createElement("li"); li.textContent = name; ul.appendChild(li);. Hasilnya identik secara struktur dengan innerHTML, tetapi aman dari XSS sejak awal.

Kapan Anda Harus Menggunakan innerHTML

Untuk HTML tepercaya yang dibuat oleh peladen (keluaran templat Anda sendiri atau teks kaya yang telah disanitasi dari editor tepercaya), innerHTML aman digunakan. Jangan pernah menerapkannya secara langsung pada data dari sumber yang tidak tepercaya tanpa sanitasi.

Sanitasi Teks Kaya dengan DOMPurify

Jika pengguna mengirimkan teks kaya (editor komentar atau tampilan markdown), lakukan sanitasi sebelum menetapkan innerHTML: el.innerHTML = DOMPurify.sanitize(richHtml). DOMPurify menghapus tag dan atribut berbahaya sambil mempertahankan pemformatan yang aman seperti <b>, <em>, dan <a>.

insertAdjacentHTML Memiliki Risiko yang Sama

el.insertAdjacentHTML("beforeend", html) mengurai teks HTML—permukaan XSS-nya sama seperti innerHTML. Aturannya juga sama: jangan pernah memasukkan data pengguna secara langsung; lakukan sanitasi atau gunakan metode DOM. Hal yang sama berlaku untuk document.write, meskipun seharusnya tidak ada yang menggunakannya lagi.

Bawaan Kerangka Kerja

React, Vue, Svelte, dan Angular secara bawaan melakukan escape pada teks yang disisipkan—{name} aman. Semuanya menyediakan celah untuk melewati pengamanan (dangerouslySetInnerHTML di React dan v-html di Vue) yang memiliki risiko XSS yang sama; gunakan secara hemat dan sertai sanitasi.

Injeksi Atribut

Bahkan nilai atribut dapat menjadi vektor serangan: <a href={url}> dengan url="javascript:alert(1)" akan menjalankan kode ketika diklik. Validasi URL berdasarkan skemanya (izinkan hanya http:, https:, mailto:, dan tel:) sebelum menempatkan masukan pengguna dalam href, src, atau atribut lain yang berisi URL.

Kebijakan Trusted Types

Peramban modern mendukung Trusted Types: konfigurasikan CSP dengan require-trusted-types-for 'script', lalu innerHTML akan menolak teks mentah—hanya nilai yang dibungkus oleh kebijakan yang diterima. Cara ini membuat XSS mustahil melalui API, bukan dengan mengandalkan kedisiplinan.

Pertahanan Berlapis

Tidak ada satu lapisan pun yang cukup. Gabungkan validasi masukan di server, pelolosan keluaran saat rendering, CSP untuk memblokir skrip yang disisipkan, Trusted Types untuk menolak string mentah, serta peninjauan keamanan untuk setiap penggunaan innerHTML. Pertahanan berlapis tetap bertahan meskipun terdapat bug di salah satu lapisan.

Uji Pengetahuan

Mengapa el.textContent = userInput aman dari XSS, sedangkan el.innerHTML = userInput berbahaya?

Ringkasan

innerHTML pada masukan pengguna merupakan vektor XSS klasik. Gunakan textContent untuk teks, createElement+textContent untuk struktur, dan DOMPurify jika HTML kaya diperlukan. Validasi skema URL untuk nilai atribut. Lapisi CSP dan Trusted Types untuk menetralkan bug yang lolos dari peninjauan kode. Kerangka kerja modern melakukan escaping secara bawaan — gunakan celah untuk menonaktifkan perlindungan tersebut sesedikit mungkin dan tinjau setiap penggunaannya.

Gratis untuk memulai

Belajar HTML dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
40
Pelajaran
159

Pertanyaan yang Sering Diajukan

Apakah pelajaran “XSS melalui innerHTML dan Cara Mencegahnya” gratis?

Ya — teks lengkap “XSS melalui innerHTML dan Cara Mencegahnya” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus HTML Academy, upgrade ke CoddyKit PRO. Kursus HTML Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “XSS melalui innerHTML dan Cara Mencegahnya”?

Pahami skrip lintas situs dan alternatif yang aman untuk innerHTML. Kamu berlatih HTML Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai HTML Academy?

Tidak diperlukan pengalaman sebelumnya. HTML Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “XSS melalui innerHTML dan Cara Mencegahnya” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran HTML Academy ini?

Ya. Setiap pelajaran HTML Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Content Security Policy meta http-equiv
  2. XSS melalui innerHTML dan Cara Mencegahnya
  3. Sandbox iframe dan Permissions Policy
  4. HTTPS dan Integritas Subresource
← Kembali ke HTML Academy