Karakter mana yang perlu diloloskan dalam HTML?

251

Apakah mereka sama dengan XML, mungkin plus spasi satu (  )?

Saya telah menemukan beberapa daftar besar karakter pelarian HTML tetapi saya tidak berpikir mereka harus lolos. Aku ingin tahu apa yang perlu untuk melarikan diri.

Ahmet
sumber

Jawaban:

318

Jika Anda memasukkan konten teks dalam dokumen Anda di lokasi di mana konten teks diharapkan 1 , Anda biasanya hanya perlu keluar dari karakter yang sama seperti yang Anda lakukan dalam XML . Di dalam sebuah elemen, ini hanya termasuk ampersand entitas escape &dan pembatas elemen kurang dari dan lebih besar dari tanda < >:

& becomes &amp;
< becomes &lt;
> becomes &gt;

Di dalam nilai atribut, Anda juga harus menghindari karakter kutipan yang Anda gunakan:

" becomes &quot;
' becomes &#39;

Dalam beberapa kasus mungkin aman untuk lolos dari beberapa karakter ini, tetapi saya mendorong Anda untuk melarikan diri dari kelima karakter tersebut dalam semua kasus untuk mengurangi kemungkinan melakukan kesalahan.

Jika penyandian dokumen Anda tidak mendukung semua karakter yang Anda gunakan, seperti jika Anda mencoba menggunakan emoji dalam dokumen yang disandikan ASCII, Anda juga perlu menghindarinya. Sebagian besar dokumen hari ini dikodekan menggunakan pengkodean UTF-8 yang sepenuhnya mendukung Unicode di mana ini tidak diperlukan.

Secara umum, Anda tidak boleh melarikan diri dari ruang sebagai &nbsp;. &nbsp;bukan ruang normal, ini adalah ruang non-breaking . Anda dapat menggunakan ini alih-alih ruang normal untuk mencegah jeda baris disisipkan di antara dua kata, atau untuk memasukkan ruang tambahan tanpa secara otomatis diciutkan, tetapi ini biasanya merupakan kasus yang jarang terjadi. Jangan lakukan ini kecuali Anda memiliki kendala desain yang mengharuskannya.


1 Dengan "lokasi di mana konten teks diharapkan", maksud saya di dalam elemen atau nilai atribut yang dikutip di mana aturan penguraian normal berlaku. Misalnya: <p>HERE</p>atau <p title="HERE">...</p>. Apa yang saya tulis di atas tidak berlaku untuk konten yang memiliki aturan parsing khusus atau makna, seperti di dalam skrip atau tag gaya, atau sebagai elemen atau nama atribut. Sebagai contoh: <NOT-HERE>...</NOT-HERE>, <script>NOT-HERE</script>, <style>NOT-HERE</script>, atau <p NOT-HERE="...">...</p>.

Dalam konteks ini, aturannya lebih rumit dan lebih mudah untuk memperkenalkan kerentanan keamanan. Saya sangat menyarankan Anda untuk tidak pernah memasukkan konten dinamis di salah satu lokasi ini. Saya telah melihat tim pengembang yang sadar keamanan yang kompeten memperkenalkan kerentanan dengan mengasumsikan bahwa mereka telah menyandikan nilai-nilai ini dengan benar, tetapi melewatkan kasus tepi. Biasanya ada alternatif yang lebih aman, seperti menempatkan nilai dinamis dalam atribut dan kemudian menanganinya dengan JavaScript.

Jika Anda harus, silakan baca Aturan Pencegahan XSS Proyek Keamanan Aplikasi Web Terbuka untuk membantu memahami beberapa masalah yang perlu Anda ingat.

Jeremy Banks
sumber
2
Beberapa nilai atribut HTML mungkin juga memiliki makna khusus (JS / CSS). Jadi itu juga tidak berlaku untuk ini, misalnya: <p onclick="NOT-HERE">...</p>dan <p style="NOT-HERE">...</p>.
geekley
9

Pada dasarnya, ada tiga karakter utama yang harus selalu lolos dalam file HTML dan XML Anda, sehingga mereka tidak berinteraksi dengan sisa markup, jadi seperti yang Anda duga, dua di antaranya akan menjadi pembungkus sintaksis, yaitu < >, mereka terdaftar sebagai berikut:

 1)  &lt; (<)
    
 2)  &gt; (>)
    
 3)  &amp; (&)

Kami juga dapat menggunakan penawaran ganda (") sebagai" dan kutipan tunggal (') sebagai & apos

Hindari memasukkan konten dinamis ke dalam <script>dan <style>. Aturan ini tidak untuk diterapkan pada mereka. Misalnya, jika Anda harus menyertakan JSON dalam a, ganti <dengan \ x3c, karakter U + 2028 dengan \ u2028, dan U + 2029 dengan \ u2029 setelah serialisasi JSON.)

Karakter Escape HTML: Daftar Lengkap: http://www.theukwebdesigncompany.com/articles/entity-escape-characters.php

Jadi, Anda perlu melarikan diri <, atau & ketika diikuti oleh apa pun yang bisa memulai referensi karakter. Juga aturan tentang ampersand adalah satu-satunya aturan untuk atribut yang dikutip, karena tanda kutip yang cocok adalah satu-satunya hal yang akan mengakhiri satu. Tetapi jika Anda tidak ingin mengakhiri nilai atribut di sana, lepas tanda kutip.

Mengubah ke UTF-8 berarti menyimpan kembali file Anda:

Menggunakan pengkodean karakter UTF-8 untuk halaman Anda berarti bahwa Anda dapat menghindari kebutuhan untuk sebagian besar pelarian dan hanya bekerja dengan karakter. Namun, perlu diketahui bahwa untuk mengubah penyandian dokumen Anda, tidak cukup hanya dengan mengubah deklarasi penyandian di bagian atas halaman atau di server. Anda perlu menyimpan kembali dokumen Anda dalam pengkodean itu. Untuk bantuan memahami bagaimana melakukannya dengan aplikasi Anda, baca Setting encoding di aplikasi web authoring.

Karakter yang tak terlihat atau ambigu:

Peran yang sangat berguna untuk melarikan diri adalah untuk mewakili karakter yang tidak terlihat atau ambigu dalam presentasi.

Salah satu contohnya adalah karakter Unicode U + 200F RIGHT-TO-LEFT MARK. Karakter ini dapat digunakan untuk memperjelas arah dalam teks dua arah (mis. Ketika menggunakan skrip Arab atau Ibrani). Namun, tidak memiliki bentuk grafik, sehingga sulit untuk melihat di mana karakter-karakter ini ada dalam teks, dan jika mereka hilang atau dilupakan mereka dapat membuat hasil yang tidak terduga selama pengeditan nanti. Menggunakan (atau setara referensi karakter numeriknya) malah membuatnya sangat mudah untuk menemukan karakter ini.

Contoh karakter ambigu adalah U + 00A0 NO-BREAK SPACE. Jenis ruang ini mencegah pemutusan garis, tetapi terlihat seperti ruang lain saat digunakan sebagai karakter. Menggunakannya membuatnya sangat jelas di mana spasi seperti itu muncul dalam teks.

Alireza
sumber
3

Jawaban yang tepat tergantung pada konteksnya. Secara umum, karakter-karakter ini tidak boleh ada ( HTML 5.2 §3.2.4.2.5 ):

Node teks dan nilai atribut harus terdiri dari karakter Unicode, tidak boleh mengandung U + 0000 karakter, tidak boleh berisi karakter Unicode yang tidak terdefinisi secara permanen (bukan karakter), dan tidak boleh mengandung karakter kontrol selain karakter spasi. Spesifikasi ini mencakup batasan tambahan pada nilai yang tepat dari simpul Teks dan nilai atribut tergantung pada konteksnya yang tepat.

Untuk elemen dalam HTML, batasan model konten Teks juga tergantung pada jenis elemen. Misalnya, "<" di dalam elemen textarea tidak perlu di-escape dalam HTML karena textarea adalah elemen teks mentah yang bisa di-escape.

Pembatasan ini tersebar di seluruh spesifikasi. Misalnya, nilai atribut ( §8.1.2.3 ) tidak boleh berisi ampersand yang ambigu dan dapat berupa (i) kosong, (ii) dalam tanda kutip tunggal (dan dengan demikian tidak boleh mengandung karakter APOSTROPHE U + 0027 '), (iii) dalam tanda kutip ganda ( tidak boleh mengandung U + 0022 karakter MARK QUOTATION "), atau (iv) tidak dikutip - dengan batasan berikut:

... tidak boleh mengandung karakter spasi literal, karakter U + 0022 QUOTATION MARK apa pun ("), U + 0027 APOSTROPHE karakter ('), U + 003D EQUALS MENDAFTAR karakter (=), U + 003C KURANG-KURANG DARI karakter SIGN ( <), Karakter U + 003E GREATER-THAN SIGN (>), atau U + 0060 GRAVE ACCENT karakter (`), dan tidak boleh berupa string kosong.

Andrey
sumber