Salah satu kelas kerentanan yang paling umum di situs web disebut "Cross-Site Scripting" atau "XSS". Kerentanan XSS adalah di mana dimungkinkan bagi pengguna untuk menyebabkan JavaScript dieksekusi. Ada sejumlah varian kerentanan XSS yang berbeda, dengan berbagai tingkat keparahan.
Masalah dengan penyerang yang dapat mengeksekusi JavaScript di sesi pengguna lain adalah penyerang dapat melakukan apa saja ke situs web yang dilihat korban. Ini termasuk mengarahkan korban ke situs web eksternal, mencuri token otentikasi, dan memantau detail pembayaran.
Bentuk kerentanan XSS yang paling parah adalah “Stored” atau “Persistent” Cross-Site Scripting, di sinilah ada kemungkinan bagi penyerang untuk membuat muatan XSS dan kemudian mengirimkannya, sehingga disimpan dalam database. Dengan eksploit XSS yang disimpan dalam database, maka kemungkinan itu akan memengaruhi pengguna lain selama periode waktu yang luas.
Bentuk lain dari Cross-Site Scripting adalah “Reflected”, jenis ini tidak disimpan di sembarang tempat, melainkan payload disertakan di browser. Biasanya, jenis XSS ini adalah bagian dari serangan phishing, di mana penyerang mencoba mengelabui korban untuk mengklik tautan berbahaya.
Umumnya, sebagian besar serangan XSS memiliki muatan yang dikirim ke server di beberapa titik, tetapi beberapa serangan adalah murni sisi klien, tidak pernah dikirim ke server dan hanya mempengaruhi sisi klien JavaScript. Ini disebut XSS berbasis DOM karena tetap berada di Model Objek Dokumen JavaScript, atau DOM. Jenis kerentanan ini sangat sulit untuk diidentifikasi dan diselesaikan karena eksploitasi tidak pernah terlihat oleh server sehingga tidak dapat dicatat.
Secara historis teknik pencegahan terhadap kerentanan XSS adalah menyaring semua data yang dikirimkan pengguna, menggunakan daftar blokir untuk menolak pesan apa pun dengan karakter atau kata yang bermakna dalam JavaScript. Ini cenderung mengarah pada perlombaan senjata untuk menemukan jalan pintas untuk filter sekaligus juga mencegah beberapa pengiriman pengguna yang sah. Solusi yang benar adalah dengan menggunakan entitas HTML untuk mengkodekan data yang dikirimkan pengguna. dengan modul entitas HTML diaktifkan, karakter secara otomatis dikodekan ke dalam format di mana browser tahu untuk menampilkannya sebagai simbol yang benar tetapi tidak memperlakukannya sebagai kode.