Kalau seorang pengunjung bisa menaruh teks di halaman Anda yang akan dilihat pengunjung lain, dan teks itu tidak dilolosi, ia bisa menaruh skrip di sana. Skrip itu berjalan atas nama situs Anda, dengan sesi pengunjung Anda, dan bisa melakukan segala yang bisa dilakukan pengunjung itu.
Dari mana datangnya
- Sebuah komentar, sebuah nama, sebuah ulasan - apa pun yang diketik seseorang lalu ditunjukkan kepada orang lain.
- Parameter alamat yang dicetak kembali ke halaman, yaitu kotak pencarian di hampir tiap situs.
- Nama berkas yang diunggah.
- Data dari API yang tidak Anda kendalikan.
Kebiasaannya
Lolosi saat KELUARAN, tiap kali, sesuai bagian tempat Anda mencetaknya. Bukan saat masukan - data yang sama bisa dicetak ke dalam HTML, ke dalam sebuah atribut, dan ke dalam JavaScript, dan masing-masing perlu pelolosan yang berbeda.
echo htmlspecialchars($name, ENT_QUOTES, 'UTF-8');
- Di dalam teks HTML - htmlspecialchars dengan ENT_QUOTES.
- Di dalam sebuah atribut - sama saja, dan selalu apit atributnya dengan tanda kutip.
- Di dalam JavaScript - json_encode, jangan sekali-kali menyambung untai teks.
- Di dalam sebuah alamat - urlencode.
Lapis yang kedua
add_header Content-Security-Policy "default-src 'self'; script-src 'self'" always;
CSP menyuruh peramban menjalankan skrip hanya dari asal Anda sendiri, jadi skrip sisipan di dalam halaman tidak dijalankan sekalipun ada yang lolos. Terapkan dulu dalam mode lapor-saja, kalau tidak Anda akan merusak halaman Anda sendiri.
Ujilah
Taruh penanda yang tak berbahaya di tiap isian, lalu lihat SUMBER halaman yang menampilkannya. Melihat penanda Anda sebagai teks itu benar; melihatnya sebagai sebuah tag, itulah cacatnya.
