ต้องใช้อักขระใดในการหลีกเลี่ยงใน HTML


251

พวกมันเหมือนกับ XML หรืออาจบวกกับช่องว่างหนึ่ง (  )

ฉันพบรายการอักขระหลบหลีก HTML ขนาดใหญ่ แต่ฉันคิดว่าไม่ต้องหลบหนี ฉันต้องการที่จะรู้ว่าสิ่งที่ต้องการที่จะหลบหนี

คำตอบ:


318

หากคุณกำลังใส่เนื้อหาข้อความในเอกสารของคุณในสถานที่ที่มีเนื้อหาข้อความคาด1 , คุณมักจะต้องหลบหนีตัวอักษรเดียวกันตามที่คุณต้องการในรูปแบบ XML ภายในองค์ประกอบนี้รวมถึงแอมป์เอสเคป&และตัวคั่นองค์ประกอบที่มีเครื่องหมายน้อยกว่าและใหญ่กว่า< >:

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

ภายในค่าคุณลักษณะคุณต้องหลีกเลี่ยงอักขระเครื่องหมายคำพูดที่คุณใช้:

" becomes &quot;
' becomes &#39;

ในบางกรณีอาจปลอดภัยที่จะข้ามการหลบหนีตัวละครบางตัว แต่ฉันขอแนะนำให้คุณหลบหนีทั้งห้าในทุกกรณีเพื่อลดโอกาสในการทำผิดพลาด

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

&nbsp;โดยทั่วไปแล้วคุณไม่ควรหนีพื้นที่เป็น &nbsp;ไม่ได้เป็นพื้นที่ปกติมันเป็นพื้นที่ที่ไม่ทำลาย คุณสามารถใช้สิ่งเหล่านี้แทนช่องว่างปกติเพื่อป้องกันไม่ให้มีการแทรกตัวแบ่งบรรทัดระหว่างสองคำหรือเพื่อแทรกช่องว่างเพิ่มเติมโดยไม่ยุบลงโดยอัตโนมัติ แต่โดยทั่วไปจะเป็นกรณีที่ไม่ค่อยเกิดขึ้น อย่าทำสิ่งนี้จนกว่าคุณจะมีข้อ จำกัด ในการออกแบบที่จำเป็นต้องใช้


1โดย "ตำแหน่งที่คาดว่าจะมีเนื้อหาข้อความ" ฉันหมายถึงภายในองค์ประกอบหรือค่าแอตทริบิวต์ที่เสนอราคาโดยใช้กฎการแยกวิเคราะห์ตามปกติ ตัวอย่างเช่น: หรือ<p>HERE</p> <p title="HERE">...</p>สิ่งที่ฉันเขียนด้านบนไม่สามารถใช้กับเนื้อหาที่มีการแยกกฎหรือความหมายพิเศษเช่นด้านในของสคริปต์หรือแท็กสไตล์หรือเป็นองค์ประกอบหรือชื่อแอตทริบิวต์ ตัวอย่างเช่น<NOT-HERE>...</NOT-HERE>, <script>NOT-HERE</script>, หรือ<style>NOT-HERE</script><p NOT-HERE="...">...</p>

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

หากคุณต้องการโปรดอ่านกฎการป้องกัน XSS ของ Open Web Application Security Projectเพื่อช่วยให้เข้าใจถึงข้อกังวลบางอย่างที่คุณต้องคำนึงถึง


2
ค่าแอตทริบิวต์ HTML บางอย่างอาจมีความหมายพิเศษ (JS / CSS) ดังนั้นจึงยังไม่ได้นำไปใช้กับเหล่านี้ตัวอย่างเช่น: และ<p onclick="NOT-HERE">...</p> <p style="NOT-HERE">...</p>
geekley

21

มันขึ้นอยู่กับบริบท บริบทที่เป็นไปได้บางอย่างใน HTML:

  • เนื้อหาเอกสาร
  • ภายในแอตทริบิวต์ทั่วไป
  • ภายในแท็กสคริปต์
  • แท็กสไตล์ภายใน
  • อีกหลาย!

ดูเอกสารประกอบการป้องกันการเขียนสคริปต์ข้ามไซต์ของ OWASP โดยเฉพาะในส่วน " ทำไมฉันถึงไม่สามารถเข้ารหัสเอนทิตี HTML ของเอนทิตีที่ไม่น่าเชื่อถือได้? " และ " กฎการป้องกัน XSS " อย่างไรก็ตามเป็นการดีที่สุดที่จะอ่านเอกสารทั้งหมด


9

โดยทั่วไปมีตัวละครหลักสามตัวที่ควรหลีกเลี่ยงในไฟล์ HTML และ XML ของคุณเสมอดังนั้นพวกเขาจึงไม่โต้ตอบกับส่วนที่เหลือของมาร์กอัปดังนั้นอย่างที่คุณคาดหวังสองคนในนั้นจะเป็นตัวห่อไวยากรณ์ > พวกเขาอยู่ด้านล่าง:

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

นอกจากนี้เราอาจใช้เครื่องหมายคำพูดคู่ (") เป็น" และเครื่องหมายคำพูดเดี่ยว (') เป็น & apos

หลีกเลี่ยงการใส่เนื้อหาแบบไดนามิกใน<script>และ<style>กฎเหล่านี้ไม่ได้ใช้สำหรับพวกเขา ตัวอย่างเช่นหากคุณต้องรวม JSON ใน a, แทนที่ <ด้วย \ x3c, อักขระ U + 2028 ด้วย \ u2028 และ U + 2029 ด้วย \ u2029 หลังจากซีเรียลไลซ์ชัน JSON)

อักขระ Escape HTML: รายการที่สมบูรณ์: http://www.theukwebdesigncompany.com/articles/entity-escape-characters.php

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

การเปลี่ยนเป็น UTF-8 หมายถึงการบันทึกไฟล์ของคุณอีกครั้ง:

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

อักขระที่มองไม่เห็นหรือไม่ชัดเจน:

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

ตัวอย่างหนึ่งก็คืออักขระ Unicode U + 200F เครื่องหมาย RIGHT-TO-LEFT อักขระนี้สามารถใช้เพื่ออธิบายทิศทางในข้อความสองทิศทาง (เช่นเมื่อใช้สคริปต์อารบิกหรือฮิบรู) อย่างไรก็ตามไม่มีรูปแบบกราฟิกดังนั้นจึงเป็นเรื่องยากที่จะเห็นว่าตัวละครเหล่านี้อยู่ในข้อความและถ้าพวกเขาหายไปหรือลืมพวกเขาสามารถสร้างผลลัพธ์ที่ไม่คาดคิดในระหว่างการแก้ไขในภายหลัง การใช้ (หรือการอ้างอิงอักขระตัวเลขเทียบเท่า) แทนทำให้ง่ายต่อการสังเกตเห็นอักขระเหล่านี้

ตัวอย่างของอักขระที่ไม่ชัดเจนคือ U + 00A0 NO-BREAK SPACE พื้นที่ประเภทนี้ป้องกันการแตกของเส้น แต่มันก็เหมือนกับพื้นที่อื่น ๆ เมื่อใช้เป็นตัวละคร การใช้ทำให้ค่อนข้างชัดเจนเมื่อมีช่องว่างดังกล่าวปรากฏในข้อความ


3

คำตอบที่แน่นอนขึ้นอยู่กับบริบท โดยทั่วไปตัวอักษรเหล่านี้จะต้องไม่ปรากฏ ( HTML 5.2 §3.2.4.2.5 ):

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

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

ข้อ จำกัด เหล่านี้กระจายอยู่ทั่วข้อกำหนด ตัวอย่างเช่นค่าแอตทริบิวต์ ( §8.1.2.3 ) ต้องไม่มีเครื่องหมายแอมเปอร์คลุมเครือและต้องเป็น(i)ว่างเปล่า(ii)ภายในเครื่องหมายคำพูดเดี่ยว (และต้องไม่มีอักขระ U + 0027 APOSTROPHE '), (iii)ภายในเครื่องหมายคำพูดคู่ ( ต้องไม่มีอักขระเครื่องหมายคำพูด U + 0022 เครื่องหมายอัญประกาศ") หรือ(iv) ไม่ระบุ - โดยมีข้อ จำกัด ดังต่อไปนี้:

... ต้องไม่มีอักขระเว้นวรรคตามตัวอักษรอักขระเครื่องหมายอัญประกาศ U + 0022 ใด ๆ ("), U + 0027 อักขระ APOSTROPHE ('), U + 003D อักขระการลงชื่อเท่ากับ (=), U + 003C อักขระการลงชื่อน้อยกว่า ( <), U + 003E ตัวอักษรยิ่งใหญ่กว่าเครื่องหมาย (>) หรือ U + 0060 GRAVE ACCENT อักขระ (`) และต้องไม่เป็นสตริงว่าง

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