Alat pembangun · HTML entiti escaper
Menyahkod HTML entiti tanpa innerHTML: cara penyahkod jadual carian berfungsi
· Bagaimana ia berfungsi
html keselamatan pengekodan
Helah popular untuk menyahkod entiti dengan menugaskan kepada innerHTML menjalankan input anda melalui penghurai HTML, iaitu perkara yang anda tidak mahu. Siaran ini menerangkan pendekatan berasaskan jadual yang lebih selamat dan cara ia mengendalikan rujukan nama, perpuluhan dan heks.
Penyahkod yang melaksanakan <img onerror> — kes konkrit di mana 'sahaja menyahkodnya' menjadi pelaksanaan skrip
Satu pelapik biasa element.innerHTML = input melakukan lebih daripada menyahkod &. Jika input juga mengandungi <img src=x onerror=...>, pelayar mencipta elemen imej dan atribut pengendali acara. Bergantung pada cara nod itu dilampirkan dan dimuatkan, ini boleh menukar pintasan pemformatan kepada pelaksanaan skrip. Rentetan seperti HTML yang ditampal harus kekal sebagai data apabila satu-satunya tugas ialah menyelesaikan rujukan aksara, bukan dihuraikan ke dalam pepohon DOM.
Perkara yang sebenarnya dilakukan innerHTML dengan rentetan — penghuraian, penciptaan elemen dan atribut pengendali acara, bukan sahaja penggantian entiti
innerHTML memanggil penghurai HTML: teg menjadi nod, atribut memperoleh makna pelayar, dan teksContent kemudiannya membaca jalur markup daripada hasil. Teg <strong> yang anda ingin simpan sebagai input literal boleh hilang sebagai pemformatan teks. Elemen yang terpisah bukan jaminan keselamatan umum; kod selalunya memasukkan semula subpokok itu atau menggunakan HTML yang terhasil di tempat lain. Jika anda perlu memaparkan input yang tidak dipercayai, tetapkan textContent dan bersihkan sahaja apabila anda sengaja memilih untuk membuat HTML.
Pendekatan jadual carian — ungkapan biasa untuk &name;, &#NNN; dan &#xHHH;, dan peta daripada nama kepada aksara
Penyahkod ToolAcre menggunakan ungkapan biasa terhad untuk mencari rujukan borang &name;, { atau {. Rujukan bernama dicari dalam jadual eksplisit praktikal, termasuk amp, lt, gt, petikan dan tipografi biasa. Nama yang tidak diketahui dibiarkan seperti ditulis dan bukannya diteka. Pendekatan ini tidak mencipta unsur dan tidak memanggil penghurai HTML; ia sahaja menggantikan subrentetan yang diiktiraf dalam rentetan. Jadual ini sengaja merupakan subset, bukan semua rujukan aksara bernama HTML.
Mengendalikan rujukan berangka — menghuraikan titik kod perpuluhan dan heksadesimal dan menukarnya kepada rentetan, termasuk aksara astral
Untuk rujukan berangka, huraikan perpuluhan selepas &# atau perenambelasan selepas &#x, kemudian tukar titik kod angka kepada aksara dengan String.fromCodePoint. Nilai astral seperti 0x1F600 menghasilkan emoji, bukan dua aksara boleh cetak bebas. Pelaksanaan juga memetakan nilai julat kawalan Windows-1252 bersejarah seperti yang dilakukan oleh pelayar; sifar, mata kod pengganti dan nilai di atas U+10FFFF menjadi aksara gantian. Pengendalian ralat eksplisit itu mengekalkan nombor yang tidak sah daripada ranap penyahkod.
Contoh yang berjaya: menyahkod rentetan yang mencampurkan &, © dan 😀 — setiap perlawanan diselesaikan daripada jadual atau nombor
Nyahkod input literal &, © dan 😀: rujukan pertama memetakan melalui jadual yang dinamakan kepada &, perpuluhan 169 menjadi © dan hex 1F600 menjadi 😀. Sertakan <img onerror="alert(1)"> mentah di sebelahnya. Penyahkod mengembalikan urutan yang kelihatan teg itu sebagai aksara rentetan biasa; ia tidak mencipta imej atau melaksanakan acara. Apabila meletakkan hasil ke dalam halaman sebenar kemudian, gunakan sinki teks yang selamat daripada mengambil rentetan yang dinyahkod dan menyerahkannya kembali kepada innerHTML.
Perkara yang tidak akan dilakukan oleh pendekatan jadual — rujukan tanpa koma bertitik lama dan kebiasaan pemulihan ralat penghurai, melainkan dilaksanakan dengan sengaja
Pendekatan carian dengan sengaja tidak menghasilkan semula peraturan pemulihan tanpa titik koma bertitik legasi HTML. &salinan tanpa koma bertitik mungkin kekal tidak disentuh. Jadual bernama tetap juga menghilangkan banyak daripada lebih daripada dua ribu HTML5 rujukan bernama. Had tersebut adalah pertukaran jujur untuk penyahkod kecil yang boleh diramal; sahaja menerima rujukan yang ditamatkan secara eksplisit mengelakkan menganggap prosa arbitrari yang mengandungi ampersand sebagai penanda. Semak nama alat yang disokong yang didokumenkan jika keserasian pelayar penuh adalah penting.
Perkara ini tidak meliputi — membersihkan HTML yang anda ingin berikan, yang merupakan masalah berbeza
Rujukan penyahkodan tidak membersihkan HTML untuk paparan. Jika teks yang dinyahkodkan mengandungi urutan <script>, ia kekal berbahaya jika bahagian lain aplikasi kemudian memasukkannya sebagai penanda. Konteks seperti atribut HTML, rentetan JavaScript dan URL masing-masing memerlukan pengekodan dan dasar output mereka sendiri. ToolAcre mengembalikan teks; ia tidak boleh menjadikan tenggelam yang tidak selamat masa depan selamat.
Bawa pulang: layan input sebagai data — cara HTML entiti escaper menyahkod dengan jadual carian dan bukannya penghurai HTML, jadi input anda kekal sebagai teks
Anggap input sebagai data. HTML entiti escaper menyahkod dengan aritmetik jadual dan titik kod, bukan helah HTML dalaman, jadi muatan yang kelihatan markup kekal sebagai aksara lengai dalam alat. Cuba tiga rujukan, kemudian periksa kedua-dua teks yang dinyahkod dan cara anda merancang untuk menggunakannya seterusnya: sempadan keselamatan hilang jika anda mengulanginya sebagai HTML.