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.
Melolosi sewaktu data DISIMPAN adalah kesalahan klasik: nilai yang sama lalu harus dikembalikan lagi untuk surel, ekspor, atau API, dan salah satu jalur itu selalu lupa. Simpan apa yang diketik; lolosi ketika ditampilkan.

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.

Mesin templat yang melolosi secara bawaan menyingkirkan sebagian besar cacat jenis ini. Kalau punya Anda begitu, jangan meraih pembantu "cetak mentah" tanpa alasan yang bisa Anda bela.