flawopen.com/Cross-Site Scripting
Cross-Site Scripting
Cross-site scripting terjadi ketika halaman memuat teks dari seorang pengguna dengan cara yang diurai browser sebagai HTML atau JavaScript, sehingga teks itu berjalan bagi pengguna lain dengan wewenang situs itu sendiri. Perbaikannya sama di mana pun: encode setiap nilai sesuai tempat persis ia ditulis, sanitasi segelintir field yang harus menerima HTML, dan perkuat keduanya dengan Content Security Policy. Pilih bahasa Anda di bawah untuk melihat API yang tepat, kode rentan dan kode yang sudah diperbaiki, serta aturan CI yang menangkap masalah ini.
Penjelasan Sederhana (ELI5)
Sebuah koran memuat surat pembaca di halamannya sendiri. Seorang pembaca mengirim surat yang tata letaknya persis seperti pengumuman redaksi: 'Pelanggan: hubungi nomor ini dan sebutkan data kartu Anda untuk perpanjangan.' Karena dicetak dengan huruf khas koran itu, pembaca memercayainya seolah redaksi yang menulis. XSS adalah situs web yang mencetak teks pengunjung ke halamannya sendiri, sehingga browser memperlakukannya sebagai kode situs itu, lengkap dengan akses situs ke akun Anda. Escaping berarti mencetak setiap surat di dalam kotak kutipan yang jelas, sehingga tidak ada surat yang bisa menyamar sebagai pengumuman redaksi.
Konsep Kunci & Istilah
- Cross-site scripting (CWE-79)
- Sebuah halaman web memuat data yang tidak tepercaya tanpa menetralkannya untuk browser, sehingga markup atau skrip di dalamnya diurai dan dijalankan di origin halaman, dengan akses ke DOM, cookie, dan API-nya.
- Reflected, stored and DOM-based XSS
- XSS reflected mengembalikan data request langsung di respons, biasanya lewat tautan yang dirancang. XSS stored menyimpan nilai lalu menyajikannya ke setiap orang yang melihat. XSS berbasis DOM bahkan tidak menyentuh server: JavaScript di klien menyalin data dari URL atau penyimpanan ke sink seperti
innerHTML. - Contextual output encoding
- Setiap konteks output membutuhkan encoding-nya sendiri: entitas HTML untuk teks elemen dan atribut berkutip, escaping string JavaScript di dalam skrip, percent-encoding di parameter URL, dan pemeriksaan skema untuk
hrefdansrc. Meng-encode HTML untuk nilai yang ditaruh di dalam skrip tidak cukup. - Sanitizing vs encoding
- Encoding menampilkan markup sebagai teks. Jika pengguna harus mengirim format, lewatkan HTML ke sanitizer berbasis allowlist (DOMPurify, nh3 sebagai penerus bleach, OWASP Java HTML Sanitizer, HtmlSanitizer, ammonia) yang mempertahankan tag yang diizinkan dan membuang skrip, event handler, serta URL
javascript:. - Content Security Policy (CSP)
- Header respons yang memberi tahu browser skrip mana yang boleh berjalan.
script-srcberbasis nonce tanpa'unsafe-inline'memblokir sebagian besar skrip yang disuntikkan meskipun ada bug encoding yang lolos, danrequire-trusted-types-for 'script'mengunci sink DOM.
Alur Serangan Langkah demi Langkah
Teks tidak tepercaya sampai ke halaman
Kata pencarian, field profil, komentar, fragmen URL, atau respons API dimuat saat halaman disusun di server atau diperbarui di browser.
Teks ditulis tanpa encoding yang tepat
Escaping template dimatikan, nilai masuk ke konteks skrip atau URL yang tidak dicakup escaping HTML, atau kode klien menetapkannya ke innerHTML. Nilai uji yang tidak berbahaya <img src=x onerror=alert(1)> tetap utuh.
Browser menguraikannya sebagai kode
Browser korban membangun elemen <img> sungguhan dan memicu onerror, atau menjalankan tautan javascript: saat diklik.
Skrip bertindak sebagai situs
Skrip berjalan dengan origin situs: ia bisa membaca halaman, memanggil API situs dengan cookie atau token korban, mengubah apa yang dilihat pengguna, dan mengirim formulir atas namanya.
Panduan XSS per bahasa
Daftar Periksa Penguatan Sistem Rekayasa
- Render setiap halaman lewat mesin template dengan autoescape aktif, dan tinjau setiap pengecualian (
|safe,Html.Raw,dangerouslySetInnerHTML,raw,unsafe { },{!! !!}). - Encode untuk konteks yang tepat: teks HTML dan atribut berkutip, string JavaScript, parameter URL; jangan pernah menyusun HTML atau JavaScript dengan penggabungan string.
- Sanitasi HTML dari pengguna dengan sanitizer allowlist yang terawat, di titik tempat HTML itu dirender.
- Hanya izinkan
httpdanhttpspada URL dari pengguna sebelum sampai kehref,src, atau navigasi. - Kirim Content-Security-Policy berbasis nonce tanpa
'unsafe-inline', ditambahX-Content-Type-Options: nosniff. - Simpan token sesi di cookie
HttpOnly,Secure, danSameSite=Lax, bukan dilocalStorage.