Jangan pernah mengeluarkan sedikit pun data apa pun ke aliran HTML yang belum melewati htmlspecialchars()
dan Anda sudah selesai. Aturan sederhana, mudah diikuti, sepenuhnya menghapus semua risiko XSS.
Sebagai seorang programmer, ini adalah Anda pekerjaan untuk melakukannya.
Anda dapat menentukan
function h(s) { return htmlspecialchars(s); }
jika htmlspecialchars()
terlalu panjang untuk menulis 100 kali per file PHP. Di sisi lain, menggunakan htmlentities()
tidak perlu sama sekali.
Poin kuncinya adalah:Ada kode, dan ada data. Jika Anda mencampurkan keduanya, hal-hal buruk akan terjadi.
Dalam kasus HTML, kode adalah elemen, nama atribut, entitas, komentar. Data adalah segalanya. Data harus diloloskan agar tidak disalahartikan sebagai kode.
Dalam hal URL, kode adalah skema, nama host, jalur, mekanisme string kueri (?
, &
, =
, #
). Data adalah segalanya dalam string kueri:nama dan nilai parameter. Mereka harus diloloskan agar tidak disalahartikan sebagai kode.
URL yang disematkan dalam HTML harus diloloskan dua kali (dengan lolos dari URL dan HTML-escape) untuk memastikan pemisahan yang tepat antara kode dan data.
Peramban modern mampu mengurai markup yang rusak dan salah menjadi sesuatu yang berguna. Kemampuan ini tidak boleh ditekankan. Fakta bahwa sesuatu terjadi untuk bekerja (seperti URL di <a href>
tanpa pelolosan HTML yang tepat diterapkan) tidak berarti baik atau benar untuk melakukannya. XSS adalah masalah yang berakar pada a) orang yang tidak menyadari pemisahan data/kode (mis.
XSS cukup mudah untuk dihindari jika Anda memastikan Anda tidak termasuk dalam kategori a) dan b).