Karakter apa yang harus diloloskan dengan entitas HTML mereka. Misalnya, &
lolos dengan &
.
Haruskah '
melarikan diri '
?
Saya tidak memiliki hak komentar, atau saya akan meninggalkan ini sebagai komentar pada jawaban sebelumnya.
JANGAN, saya ulangi, JANGAN lepas dari tanda kutip dalam menggunakan HTML
'
Ini bukan referensi entitas karakter HTML yang valid. Ini adalah referensi entitas karakter XML. Sementara Firefox dan Chrome, setidaknya, akan membuat yang di atas sebagai tanda kutip dalam dokumen HTML, Internet Explorer tidak akan. Dan itu mengikuti standar ketika menolak untuk melakukannya.
Anda dapat menghindari apostrof dalam menggunakan HTML
'
Tapi saya tidak percaya itu, secara umum, perlu.
http://fishbowl.pastiche.org/2003/07/01/the_curse_of_apos/
http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references
&apos
sekarang valid untuk HTML5. Yang sedang berkata jika Anda harus mendukung browser lama atau menulis email HTML untuk Outlook maka Anda sebaiknya berpegang teguh'
jika Anda menganggap perlu untuk keluar dari karakter.Saya tidak setuju dengan Nate. Anda sebaiknya menggunakan sesedikit mungkin lolos dan menggunakan UTF-8 untuk mengekspresikan karakter secara asli. Untuk melakukan ini, Anda memerlukan editor yang dapat menangani UTF-8 serta deklarasi rangkaian karakter yang benar, seperti:
Namun, Anda harus membiasakan diri untuk melarikan diri dari karakter yang memiliki makna khusus dalam (X) HTML, yaitu:
Ini akan memastikan Anda tidak sengaja menulis markup ketika Anda ingin menulis karakter ini. Ini sangat penting untuk input pengguna, untuk menjaga keamanan. Itu kurang jelas, tetapi sebenarnya penting untuk melarikan diri
"
. Jika sebuah string berakhir dengan atribut HTML (title="something"
dll.) Pengguna dapat mengakhiri atribut dan menyisipkan markup mereka sendiri. Bayangkan apa yang terjadi jika pengguna masuk" onclick="alert('hello');
dan Anda memasukkannyatitle="..."
Jika Anda menggunakan PHP, Anda dapat menggunakan
htmlspecialchars
fungsi untuk melakukan ini. Bahasa lain mungkin memiliki fungsi serupa lainnya.Pembaruan: Saya berdiri dikoreksi pada masalah APOS. IE sial sial.
sumber
'
tidak'
. Jika, karena alasan apa pun, Anda menggunakan tanda kutip tunggal untuk atribut HTML sepertititle='something'
Anda jelas harus lolos dari tanda kutip tunggal di dalam nilai atribut tersebut.Itu tergantung pada kasus penggunaan Anda, tetapi kami mungkin harus berkecil dari menggunakan
'
bahasa alami secara umum, jadi masalah tidak akan muncul kecuali Anda memiliki kode komputer di XML Anda.Di mana kami memiliki string yang diterjemahkan, kami menemukan bahwa beberapa penerjemah mengganti tanda kutip penutup dengan tanda kutip unicode, tetapi meninggalkan tanda kutip lurus sebagai tanda kutip pembukaan, meninggalkan mereka secara visual tidak seimbang dan tampak tidak profesional.
Karakter unicode
‘
dan’
harus diganti'
jika memungkinkan, sebanyak“
dan”
harus diganti"
. Ini berguna karena komputer tidak mengenali tanda baca keriting sebagai istimewa. (Meskipun saya geli melihat bahwa Stack Overflow / Chrome menganggap 'don’t
' sebagai kesalahan ejaan, sedangkan itu senang dengan 'don't
'.)Itu tidak membantu bahwa kita memiliki karakter yang sangat menarik
'
dan"
tepat di keyboard.sumber
Jadi mari kita lihat apakah StackExchange sendiri mengkodekan tanda kutip menggunakan entitas HTML.
Berikut adalah beberapa contoh dari kode sumber halaman ini.
(1) Judul pertanyaan: Disandikan.
(2) jawaban drew: Tidak dikodekan.
(3) Komentar Tom tentang jawaban nitro2k01: Dienkodekan.
Demikian seterusnya.
Namun, kode sumber halaman ini tidak pernah digunakan
'
. Semua penyandian berbentuk'
. Ini konsisten dengan nitro2k01 dan saran drew untuk tidak digunakan'
.sumber
Di mana string itu pergi?
Jawaban Anda tergantung pada konteksnya:
Jika Anda menulis paragraf dalam HTML dengan data ini, itu mungkin cukup untuk melarikan diri <,> dan &:
<p>{string}</p>
Jika Anda menulis ke atribut HTML, suka
<a href='/some/path/{string}'>...</a>
Maka Anda harus benar-benar melarikan diri dari tanda kutip. Ini bisa menjadi vektor serangan jika penyerang memasukkan ini untuk
string
:Hal yang sama berlaku untuk tanda kutip ganda. Saya bahkan pernah membaca bahwa backtick `rentan, karena itu dapat digunakan untuk atribut HTML juga. Jika Anda tidak memiliki skrip pemeriksaan sintaksis HTML otomatis sebagai bagian dari rutinitas penerapan Anda, asumsikan bahwa salah satu dari ketiganya dapat digunakan, dan harus diloloskan untuk atribut HTML.
Pada ekstrem, atribut yang bahkan dikutip tidak valid, jadi karakter spasi juga perlu melarikan diri. Dan
!
,@
,$
,%
,(
,)
,=
,+
,{
,}
,[
, dan]
, yang semuanya dapat keluar dari atribut dan memungkinkan memasukkan yang baru.Apa yang saya lakukan
Untuk melakukan pelolosan dalam JavaScript, saya menggunakan JQuery
$(element).text(string)
atau$(element).attr(attrname, string)
untuk melakukan pelolosan bagi saya. Berhati-hatilah dengan$(element).html(unsafe)
, yang tidak luput dari HTML Anda!Pada kode sisi server, saya harus hati-hati mengevaluasi risiko untuk setiap kasus dan membaca dokumentasinya dengan cermat. Ini akan tergantung pada bahasa dan perpustakaan tertentu yang Anda gunakan, seperti Rails, Django, PHP mentah, Drupal, dll.
Database
Jika Anda mempertimbangkan untuk menghentikan masalah sedini mungkin, sebelum bahkan masuk ke dalam basis data Anda, pegang kuda Anda. Meloloskan diri dari teks yang tersimpan dalam DB dapat membawa Anda dalam perjalanan yang sulit. Bagaimana jika nanti Anda ingin mengizinkan tag HTML tertentu, tetapi tidak yang lain, seperti miring, tebal, warna, dan tabel? Bagaimana jika Anda melewatkan sesuatu di pass pertama Anda, tetapi escaper Anda sudah lolos
&
sebagai&
dan"
sebagai"
? Apakah itu akan mengubah mereka menjadi&amp;
dan&quot;
?Pendekatan saya adalah hanya menjalankan SQL untuk database, tetapi tinggalkan semua karakter khusus HTML untuk diproses nanti. Dengan cara ini, saya dapat men-debug dan menyempurnakan HTML saya dengan mudah. Pikiran, itu juga berarti saya tidak bisa mempercayai tabel SQL saya sendiri jika mereka memiliki string yang disediakan pengguna.
Moral
Jangan pernah mempercayai input yang dikontrol pengguna, dan selalu mengutip atribut HTML Anda!
Berdasarkan pada: Ada lebih banyak hal untuk keluar HTML daripada &, <,>, dan " oleh Ryan Grove
sumber
Jika apostrof Anda milik konten, lepas darinya. Setiap karakter konten lain yang dapat dikacaukan dengan kode, hindarilah.
sumber
Cara termudah untuk melakukan pekerjaan tanpa menggunakan entitas aktual adalah dengan menggunakan PHP
htmlentities()
atauhtmlspecialchars()
fungsi:sumber