Haruskah saya lepas dari karakter Apostrophe (') dengan entitas HTML-nya (& # 39;)?

38

Karakter apa yang harus diloloskan dengan entitas HTML mereka. Misalnya, &lolos dengan &.

Haruskah 'melarikan diri '?

Tom
sumber

Jawaban:

41

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

menggambar
sumber
Saya tahu ini akan benar ketika ini diposting, namun melihat artikel Wikipedia yang muncul &apossekarang 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.
tomhughes
24

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:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

Namun, Anda harus membiasakan diri untuk melarikan diri dari karakter yang memiliki makna khusus dalam (X) HTML, yaitu:

< &lt;
> &gt;
" &quot;
& &amp;
' &#39;

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 htmlspecialcharsfungsi untuk melakukan ini. Bahasa lain mungkin memiliki fungsi serupa lainnya.

Pembaruan: Saya berdiri dikoreksi pada masalah APOS. IE sial sial.

nitro2k01
sumber
Saya punya dua jawaban yang bertentangan sekarang. Satu merekomendasikan untuk melarikan diri 'dan yang lainnya tidak. Apa yang harus saya percayai?
Tom
7
Pendeknya. Anda mungkin atau mungkin tidak menghindarinya atas kebijakan Anda. Jika ya, gunakan &#39;tidak &apos;. Jika, karena alasan apa pun, Anda menggunakan tanda kutip tunggal untuk atribut HTML seperti title='something'Anda jelas harus lolos dari tanda kutip tunggal di dalam nilai atribut tersebut.
nitro2k01
paragraf kedua Anda adalah apa yang penting bagi saya, OCD saya menendang ke overdrive ketika saya melihat botch merah teks di komit git saya karena tanda kutip unescaped imgur.com/a/LN0Pu89
eballeste
6

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.

android.weasel
sumber
1

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.

Should I escape the Apostrophe ( &#39; ) character with its HTML entity (&amp;#39;)?

(2) jawaban drew: Tidak dikodekan.

But I don't believe it is, in general, necessary.

(3) Komentar Tom tentang jawaban nitro2k01: Dienkodekan.

I&#39;ve got two contradicting answers now. One recommends escaping &#39; and the other does not. What should I believe?

Demikian seterusnya.

Namun, kode sumber halaman ini tidak pernah digunakan &apos;. Semua penyandian berbentuk &#39;. Ini konsisten dengan nitro2k01 dan saran drew untuk tidak digunakan &apos;.

jkdev
sumber
1
Meskipun dalam semua 3 contoh itu tidak perlu dikodekan HTML.
MrWhite
1

Di mana string itu pergi?

Jawaban Anda tergantung pada konteksnya:

  1. Jika Anda menulis paragraf dalam HTML dengan data ini, itu mungkin cukup untuk melarikan diri <,> dan &:

    <p>{string}</p>

  2. 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:

string = "' onmouseover='alert(\"nasty script here!\")' data-ignore='"
  1. 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.

  2. 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 &amp;dan "sebagai &quot;? Apakah itu akan mengubah mereka menjadi &amp;amp;dan&amp;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

Chaim-Leib Halbert
sumber
-1

Jika apostrof Anda milik konten, lepas darinya. Setiap karakter konten lain yang dapat dikacaukan dengan kode, hindarilah.

Matahari
sumber
"Jika apostrofmu milik konten, lepas darinya." - Ini tampaknya salah (seolah-olah tidak ada kata "jangan"). Jika apostrof adalah bagian dari konten, maka jangan menghindarinya - seharusnya tidak perlu.
MrWhite
-4

Cara termudah untuk melakukan pekerjaan tanpa menggunakan entitas aktual adalah dengan menggunakan PHP htmlentities()atau htmlspecialchars()fungsi:

$val = htmlspecialchars("Don't", ENT_QUOTES, 'UTF-8');
if($_POST){
  $val = htmlspecialchars(trim($_POST['val']), ENT_QUOTES, 'UTF-8');
}
echo "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'> 
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en' class='njs'> 
  <head>
    <meta http-equiv='Content-type' content='text/html;charset=utf-8' />
    <title>Special Characters</title>
    <style type='text/css'>
      @import 'special.css';
    </style>
  </head>
<body>
  <form method='post' action='' id='fm' name='fm'>
    <input type='text' value='$val' name='val' id='val' />
    <input type='submit' value='submit' name='sub' id='sub' />
  </form>
</body>
  <script type='text/javascript' src='special.js'></script>
</html>";
Dewan
sumber
4
Apakah ini lelucon?
Su '17
@Su 'Aku khawatir itu bukan ...
William Edwards