ฉันควรหลีกเลี่ยงอักขระ Apostrophe (') ด้วยเอนทิตี HTML (& # 39;) หรือไม่


38

ควรใช้อักขระใดกับหน่วยงาน HTML ตัวอย่างเช่นมีการหนีไปกับ&&

ควร'หนีด้วย'ไหม?

คำตอบ:


41

ฉันไม่มีสิทธิ์แสดงความคิดเห็นหรือฉันจะทิ้งสิ่งนี้ไว้เป็นความคิดเห็นในคำตอบก่อนหน้า

ไม่ฉันขอย้ำอย่าใช้เครื่องหมายอัญประกาศเดี่ยวใน HTML โดยใช้

'

นี่ไม่ใช่การอ้างอิงเอนทิตีอักขระ HTML ที่ถูกต้อง มันเป็นการอ้างอิงเอนทิตีอักขระ XML ในขณะที่ Firefox และ Chrome อย่างน้อยที่สุดจะแสดงข้อความข้างต้นเป็นเครื่องหมายอัญประกาศเดี่ยวในเอกสาร HTML แต่ Internet Explorer จะไม่แสดง และเป็นไปตามมาตรฐานเมื่อปฏิเสธที่จะทำเช่นนั้น

คุณสามารถใช้เครื่องหมายอัญประกาศเดี่ยวใน HTML ได้

'

แต่ฉันไม่เชื่อว่าโดยทั่วไปจำเป็น

http://fishbowl.pastiche.org/2003/07/01/the_curse_of_apos/

http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references


ฉันรู้ว่าสิ่งนี้จะถูกต้องเมื่อมีการโพสต์อย่างไรก็ตามการดูบทความ Wikipedia &aposซึ่งตอนนี้ดูเหมือนว่าจะถูกต้องของ HTML5 ดังที่กล่าวไว้ถ้าคุณต้องสนับสนุนเบราว์เซอร์รุ่นเก่าหรือเขียนอีเมล HTML สำหรับ Outlook คุณจะต้องดำเนินการให้ดีที่สุด'หากคุณเห็นว่าจำเป็นต้องหลีกเลี่ยงอักขระ
tomhughes

24

ฉันไม่เห็นด้วยกับเนท คุณควรใช้การหลบหนีให้น้อยที่สุดเท่าที่จะทำได้และใช้ UTF-8 เพื่อแสดงตัวละครโดยกำเนิด ในการดำเนินการนี้คุณต้องมีเครื่องมือแก้ไขที่สามารถจัดการ UTF-8 ได้เช่นเดียวกับการประกาศชุดอักขระที่ถูกต้องเช่น:

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

อย่างไรก็ตามคุณควรทำให้เป็นนิสัยที่จะหลีกเลี่ยงตัวละครที่มีความหมายพิเศษใน (X) HTML กล่าวคือ:

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

สิ่งนี้จะทำให้แน่ใจว่าคุณไม่ได้เขียนมาร์กอัปโดยไม่ตั้งใจเมื่อคุณต้องการเขียนอักขระเหล่านี้ สิ่งนี้สำคัญอย่างยิ่งสำหรับการป้อนข้อมูลของผู้ใช้เพื่อรักษาความปลอดภัย มันเห็นได้ชัดน้อยลง "แต่มันเป็นสิ่งสำคัญที่จะหลบหนีจริง หากสตริงสิ้นสุดลงในแอตทริบิวต์ HTML ( title="something"ฯลฯ ) ผู้ใช้สามารถสิ้นสุดคุณสมบัติและแทรกมาร์กอัปของตนเอง ลองนึกภาพว่าจะเกิดอะไรขึ้นหากผู้ใช้ป้อน" onclick="alert('hello');และคุณใส่สิ่งนั้นลงไปtitle="..."

หากคุณใช้ PHP คุณสามารถใช้htmlspecialcharsฟังก์ชั่นนี้ได้ ภาษาอื่น ๆ อาจมีฟังก์ชั่นอื่นที่คล้ายคลึงกัน

อัปเดต:ฉันได้รับการแก้ไขในเรื่อง apos ไอ้เวรที่น่ารำคาญ


ฉันได้คำตอบที่ขัดแย้งกันสองคำแล้ว หนึ่งแนะนำให้หลบหนี 'และอื่น ๆ ไม่ได้ ฉันควรเชื่ออะไร
ทอม

7
ในระยะสั้น คุณสามารถหรือไม่หนีตามดุลยพินิจของคุณ ถ้าคุณทำใช้ไม่ได้&#39; &apos;หากไม่ว่าด้วยเหตุผลใดก็ตามคุณใช้เครื่องหมายคำพูดเดี่ยวสำหรับแอตทริบิวต์ HTML อย่างtitle='something'ชัดเจนคุณจะต้องหลีกเลี่ยงคำพูดใด ๆ ที่อยู่ภายในค่าแอตทริบิวต์นั้น
nitro2k01

ย่อหน้าที่สองของคุณคือสิ่งที่สำคัญสำหรับฉัน OCD ของฉันถูกขับออกมาเกินพิกัดเมื่อฉันเห็นข้อความสีแดงในคอมไพล์ของฉันเนื่องจาก apostrophes ที่ไม่ใช้ค่า Escape imgur.com/a/LN0Pu89
eballeste

6

มันขึ้นอยู่กับกรณีการใช้งานของคุณ แต่เราอาจไม่แนะนำให้ใช้'ในภาษาธรรมชาติโดยทั่วไปดังนั้นปัญหาไม่ควรเกิดขึ้นหากคุณไม่มีรหัสคอมพิวเตอร์ใน XML ของคุณ

ที่เรามีการแปลสตริงเราพบว่านักแปลบางคนแทนที่อัญประกาศปิดด้วยอัญประกาศโค้ง Unicode แต่ปล่อยให้คำพูดตรงเป็นคำพูดเปิดให้พวกเขาไม่สมดุลสายตาและมองไม่เป็นมืออาชีพ

อักขระ Unicode และควรเปลี่ยน'ที่เป็นไปได้มากที่สุดเท่าที่และควรเปลี่ยน "สิ่งนี้มีประโยชน์เพราะคอมพิวเตอร์ไม่รู้จักเครื่องหมายวรรคตอนเป็นพิเศษ (แม้ว่าฉันจะขบขันที่จะเห็นว่า Stack Overflow / Chrome ถือว่า ' don’t' เป็นข้อผิดพลาดในการสะกดคำ แต่ในขณะที่พอใจกับ ' don't')

มันไม่ได้ช่วยให้เรามีสิ่งที่น่าหลงใหล'และมี"ตัวละครอยู่บนคีย์บอร์ด


1

ดังนั้นเรามาดูว่า StackExchange เข้ารหัส apostrophe โดยใช้เอนทิตี HTML หรือไม่

นี่คือตัวอย่างจากซอร์สโค้ดของหน้านี้

(1) ชื่อคำถาม: เข้ารหัส

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

(2) คำตอบของ drew: ไม่ได้เข้ารหัส

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

(3) ความเห็นของทอมต่อคำตอบของ nitro2k01: เข้ารหัส

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

ดังนั้นมันจึงไปได้ทั้งสองทาง

&apos;อย่างไรก็ตามซอร์สโค้ดของหน้านี้ไม่เคยใช้ &#39;ทั้งหมดการเข้ารหัสที่มีรูปแบบ ซึ่งสอดคล้องกับ nitro2k01 และคำแนะนำของ Drew &apos;ไม่ได้ที่จะใช้งาน


1
แม้ว่าในทั้ง 3 กรณีจะไม่จำเป็นต้องเข้ารหัส HTML
MrWhite

1

สายนั้นจะไปไหน

คำตอบของคุณขึ้นอยู่กับบริบท:

  1. หากคุณกำลังเขียนย่อหน้าใน HTML ด้วยข้อมูลนี้มันอาจจะเพียงพอที่จะหลบหนี <,> และ &:

    <p>{string}</p>

  2. หากคุณกำลังเขียนถึงคุณลักษณะ HTML เช่น

    <a href='/some/path/{string}'>...</a>

จากนั้นคุณก็ควรหลีกเลี่ยงอะพอสโทรฟี นี่อาจเป็นเวกเตอร์การโจมตีหากผู้โจมตีใส่สิ่งนี้ไว้ในstring:

string = "' onmouseover='alert(\"nasty script here!\")' data-ignore='"
  1. สิ่งเดียวกันสำหรับคำพูดสองครั้ง ฉันได้อ่านด้วยว่า backtick `นั้นมีความเสี่ยงเนื่องจากสามารถใช้สำหรับแอตทริบิวต์ HTML ได้เช่นกัน หากคุณไม่มีสคริปต์ตรวจสอบไวยากรณ์ HTML อัตโนมัติซึ่งเป็นส่วนหนึ่งของรูทีนการปรับใช้ของคุณให้สมมติว่าหนึ่งในสามเหล่านี้สามารถใช้งานได้และจะต้องหลีกเลี่ยงสำหรับแอตทริบิวต์ HTML

  2. ที่สุดขีดแม้แอตทริบิวต์ที่ไม่มีเครื่องหมายจะถูกต้องดังนั้นอักขระเว้นวรรคก็จะต้องหลบหนี และ!, @, $, %, (, ), =, +, {, }, [และ]ซึ่งทั้งหมดนี้สามารถแยกออกจากแอตทริบิวต์และอนุญาตให้ใส่ใหม่

สิ่งที่ฉันทำ

ในการหลบหนีใน JavaScript ฉันใช้ JQuery $(element).text(string)หรือ$(element).attr(attrname, string)เพื่อหลบหนีสำหรับฉัน ระวังให้ดีด้วย$(element).html(unsafe)ซึ่งจะไม่หนี HTML ของคุณ!

ในรหัสฝั่งเซิร์ฟเวอร์ฉันต้องประเมินความเสี่ยงอย่างรอบคอบสำหรับแต่ละกรณีและอ่านเอกสารอย่างละเอียด สิ่งนี้จะขึ้นอยู่กับภาษาและไลบรารีที่คุณใช้เช่น Rails, Django, PHP ดิบ, Drupal เป็นต้น

ฐานข้อมูล

หากคุณกำลังพิจารณาที่จะหยุดปัญหาให้เร็วที่สุดก่อนที่มันจะเข้าไปในฐานข้อมูลของคุณให้จับม้าไว้ HTML ที่หนีออกมาจากข้อความที่เก็บไว้ในฐานข้อมูลของคุณสามารถนำคุณไปสู่ความสนุกสนาน ถ้าคุณต้องการอนุญาตแท็ก HTML บางอันในภายหลัง แต่ไม่ใช่แท็กอื่น ๆ เช่นตัวเอียงตัวหนาสีและตาราง เกิดอะไรขึ้นถ้าคุณพลาดอะไรบางอย่างในครั้งแรกผ่านของคุณ แต่คุณ Escaper หนีแล้ว&เป็น&amp;และ"เป็น&quot;? มันจะเปลี่ยนสิ่งเหล่านั้นเป็น&amp;amp;และ&amp;quot;?

วิธีการของฉันคือการใช้ SQL escaping สำหรับฐานข้อมูล แต่ปล่อยให้ตัวอักษรพิเศษ HTML ทั้งหมดสำหรับการประมวลผลในภายหลัง ด้วยวิธีนี้ฉันสามารถดีบักและปรับแต่ง HTML ของฉันได้อย่างง่ายดาย ใจนั่นก็หมายความว่าฉันไม่สามารถเชื่อถือตาราง SQL ของตัวเองถ้าพวกเขามีสตริงที่ผู้ใช้ให้

คุณธรรม

อย่าไว้ใจอินพุตที่ผู้ใช้ควบคุมและให้อ้างคุณลักษณะ HTML ของคุณเสมอ!

จาก: ยังมีอีกมากมายที่จะหลีกเลี่ยง HTML มากกว่า &, <,> และ "โดย Ryan Grove


-1

หากเครื่องหมายอัญประกาศเดี่ยวของคุณเป็นเนื้อหาให้หนีไป อักขระเนื้อหาอื่นใดที่อาจสับสนกับรหัสให้หลีกเลี่ยง


"หากเครื่องหมายอัญประกาศเดี่ยวของคุณเป็นของเนื้อหาให้หนีไป" - สิ่งนี้ดูเหมือนจะไม่ถูกต้อง (ราวกับหายไปจากคำว่า "ไม่") หากเครื่องหมายอัญประกาศเดี่ยวเป็นส่วนหนึ่งของเนื้อหาอย่าหลบหนี - ไม่จำเป็นต้องมี
MrWhite

-4

วิธีที่ง่ายที่สุดในการทำงานโดยไม่ต้องใช้เอนทิตีที่แท้จริงคือการใช้ PHP htmlentities()หรือhtmlspecialchars()ฟังก์ชั่น:

$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>";

4
นี่เรื่องตลกใช่ไหม?
Su '17

@Su' ฉันกลัวมันไม่ได้ ...
วิลเลี่ยมเอ็ดเวิร์ด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.