บทความทั้งหมด

HTML Entities: วิธีแสดงอักขระพิเศษอย่างปลอดภัย

ใน HTML อักขระ <, > และ & มีความหมายพิเศษและต้อง escape เสมอ แต่ภาษาไทยมีความซับซ้อนอีกชั้นหนึ่งที่ต่างจากภาษาที่ใช้ตัวอักษรเดี่ยว นั่นคือสระและวรรณยุกต์ที่ลอยอยู่เหนือหรือใต้พยัญชนะ ซึ่งกระทบโดยตรงต่อการเข้ารหัสเป็นเอนทิตี

สระลอยและวรรณยุกต์: อักขระที่ต้องเรียงลำดับให้ถูก

คำภาษาไทยอย่าง "กี่" ประกอบด้วยพยัญชนะ สระที่ลอยอยู่ด้านบน และวรรณยุกต์ที่ซ้อนทับกันอีกชั้น ซึ่งแต่ละส่วนเป็นอักขระ Unicode แยกกันคนละตัว หากมีการตัดข้อความผิดตำแหน่งระหว่างแปลงเป็นเอนทิตีตัวเลข สระหรือวรรณยุกต์อาจหลุดจากพยัญชนะที่มันควรอยู่ด้วย ทำให้ข้อความหลังถอดรหัสแสดงผลเพี้ยนหรือลอยผิดตำแหน่ง

ไม่มีเอนทิตีแบบมีชื่อสำหรับอักษรไทย

ต่างจากอักษรละตินบางตัวที่มีเอนทิตีแบบมีชื่อ เช่น &eacute; อักษรไทยทุกตัวไม่มีชื่อเอนทิตีเฉพาะ ตัวอักษร "ก" ต้องเขียนด้วยรหัสตัวเลขเท่านั้น เช่น &#3585; ดังนั้นเครื่องมือใดก็ตามที่แปลงข้อความภาษาไทยเป็นเอนทิตีจะต้องพึ่งพารหัสตัวเลขหรือเลขฐานสิบหกล้วน ๆ

ชุดอักขระขั้นต่ำที่ต้อง escape

  • <&lt; — เพื่อไม่ให้แท็กเริ่มต้น
  • >&gt; — เพื่อปิดข้อความหลังแท็กอย่างถูกต้อง
  • &&amp; — เพื่อไม่ให้ & ถูกอ่านเป็นจุดเริ่มต้นของเอนทิตีอื่น
  • " และ '&quot;, &#39; — จำเป็นภายในค่าแอตทริบิวต์ที่อยู่ในเครื่องหมายคำพูด

ไม่มีการเว้นวรรคระหว่างคำ: ผลกระทบต่อการแสดงผล

ภาษาไทยไม่เว้นวรรคระหว่างคำในประโยคเดียวกัน เบราว์เซอร์จึงต้องใช้กฎการตัดคำภายในเพื่อขึ้นบรรทัดใหม่ให้ถูกจุด การแทรกเอนทิตีตัวเลขกลางคำโดยไม่ตั้งใจ (เช่นจากการตัดสตริงผิดตำแหน่ง) อาจทำให้ตัวตัดคำของเบราว์เซอร์สับสนและขึ้นบรรทัดใหม่ในตำแหน่งที่ไม่เหมาะสม

ความเกี่ยวข้องกับ XSS

ช่องโหว่ XSS ส่วนใหญ่เกิดขึ้นเพราะข้อความที่ผู้ใช้ป้อนเข้ามาถูกแทรกลงใน HTML โดยไม่ escape การแสดงผล "<script>...</script>" โดยไม่แปลงเป็นเอนทิตีจะทำให้เบราว์เซอร์รันมันเป็นโค้ด การ escape เป็นมาตรการป้องกันพื้นฐาน — แต่ไม่ใช่มาตรการเดียว

บริบทมีความสำคัญ: ข้อความเทียบกับแอตทริบิวต์

การ escape <, > และ & เพียงพอสำหรับข้อความระหว่างแท็ก แต่ภายในแอตทริบิวต์ที่อยู่ในเครื่องหมายคำพูด จำเป็นต้อง escape เครื่องหมายคำพูดชนิดที่ใช้อยู่นั้นเพิ่มเติมด้วย หากแอตทริบิวต์ถูกล้อมด้วยเครื่องหมายคำพูดคู่ และในค่านั้นมีเครื่องหมายคำพูดคู่ที่ไม่ถูก escape มาร์กอัปจะขาดเร็วกว่าที่คาดไว้

ลองใช้เครื่องมือ