ไทย

เครื่องมือสำหรับนักพัฒนา · HTML ตัวหนีเอนทิตี

การถอดรหัสเอนทิตี HTML ที่ไม่มี HTML ภายใน: วิธีการทำงานของตัวถอดรหัสตารางการค้นหา

· มันทำงานอย่างไร

html ความปลอดภัย การเข้ารหัส

การเข้ารหัสการอ้างอิง HTML การแมปกับข้อความที่ไม่เป็นอันตรายโดยไม่ต้องสร้างโหนด DOM
ภาพประกอบเวกเตอร์ต้นฉบับ ToolAcre

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

ตัวถอดรหัสที่ดำเนินการ <img onerror> - กรณีที่เป็นรูปธรรมซึ่ง 'เพิ่งถอดรหัสมัน' กลายเป็นการเรียกใช้สคริปต์

บรรทัดเดียวทั่วไป element.innerHTML = อินพุตทำหน้าที่มากกว่าการถอดรหัส &amp; หากอินพุตยังมี <img src=x onerror=...> เบราว์เซอร์จะสร้างองค์ประกอบรูปภาพและแอตทริบิวต์ตัวจัดการเหตุการณ์ ขึ้นอยู่กับวิธีการแนบและโหลดโหนดนั้น ซึ่งสามารถเปลี่ยนทางลัดการจัดรูปแบบเป็นการเรียกใช้สคริปต์ได้ สตริงที่มีลักษณะคล้าย HTML ที่วางไว้ควรยังคงเป็นข้อมูลเมื่องานเดียวคือการแก้ไขการอ้างอิงอักขระ ไม่ควรแยกวิเคราะห์เป็นแผนผัง DOM

สิ่งที่ InnerHTML ทำได้จริงกับสตริง — การแยกวิเคราะห์ การสร้างองค์ประกอบ และแอตทริบิวต์ตัวจัดการเหตุการณ์ ไม่ใช่แค่การแทนที่เอนทิตีเท่านั้น

innerHTML เรียกใช้ HTML parser: แท็กกลายเป็นโหนด คุณลักษณะรับความหมายของเบราว์เซอร์ และเนื้อหาข้อความในภายหลังจะตัดมาร์กอัปออกจากผลลัพธ์ แท็ก <strong> ที่คุณตั้งใจจะเก็บรักษาไว้เป็นการป้อนตามตัวอักษรอาจหายไปเมื่อจัดรูปแบบข้อความ องค์ประกอบที่แยกออกมาไม่ใช่การรับประกันความปลอดภัยโดยทั่วไป รหัสมักจะแทรกแผนผังย่อยนั้นอีกครั้งหรือใช้ผลลัพธ์ HTML ที่อื่น หากคุณต้องการแสดงอินพุตที่ไม่น่าเชื่อถือ ให้กำหนดเนื้อหาข้อความและทำความสะอาดเฉพาะเมื่อคุณตั้งใจเลือกที่จะแสดงผล HTML

วิธีการตารางการค้นหา — นิพจน์ทั่วไปสำหรับ &name;, &#NNN; และ &#xHHH; และแผนที่จากชื่อถึงตัวอักษร

ตัวถอดรหัสของ ToolAcre ใช้นิพจน์ทั่วไปที่มีขอบเขตเพื่อค้นหาการอ้างอิงของรูปแบบ &name;, &#123; หรือ &#x7B; ข้อมูลอ้างอิงที่มีชื่อจะถูกค้นหาในตารางที่ชัดเจนในทางปฏิบัติ รวมถึง amp, lt, gt, เครื่องหมายคำพูด และตัวพิมพ์ทั่วไป ชื่อที่ไม่รู้จักถูกทิ้งให้เขียนไว้แทนที่จะเดา วิธีการนี้ไม่สร้างองค์ประกอบใดๆ และเรียก no HTML parser; เพียงแทนที่สตริงย่อยที่รู้จักในสตริง ตารางนี้เป็นชุดย่อยโดยเจตนา ไม่ใช่การอ้างอิงอักขระที่มีชื่อทั้งหมด HTML

การจัดการการอ้างอิงที่เป็นตัวเลข - การแยกวิเคราะห์จุดรหัสทศนิยมและเลขฐานสิบหกและแปลงเป็นสตริงรวมถึงอักขระดาว

สำหรับการอ้างอิงที่เป็นตัวเลข ให้แยกวิเคราะห์ทศนิยมหลัง &# หรือเลขฐานสิบหกหลัง &#x จากนั้นเปลี่ยนจุดโค้ดตัวเลขให้เป็นอักขระที่มี String.fromCodePoint ค่าดวงดาว เช่น 0x1F600 จะให้ผลลัพธ์เป็นอีโมจิ ไม่ใช่อักขระที่สามารถพิมพ์แยกกันสองตัวได้ การใช้งานยังแมปค่าช่วงการควบคุม Windows-1252 ในอดีตเช่นเดียวกับที่เบราว์เซอร์ทำ ศูนย์ จุดโค้ดตัวแทนและค่าที่สูงกว่า U+10FFFF จะกลายเป็นอักขระแทนที่ การจัดการข้อผิดพลาดที่ชัดเจนนั้นช่วยป้องกันไม่ให้หมายเลขที่ไม่ถูกต้องทำให้ตัวถอดรหัสเสียหาย

ตัวอย่างการทำงาน: การถอดรหัสสตริงที่ผสม &amp;, &#169; และ &#x1F600; — แต่ละการจับคู่ได้รับการแก้ไขจากตารางหรือตัวเลข

ถอดรหัสอินพุตตามตัวอักษร &amp;, &#169; และ &#x1F600;: การแมปอ้างอิงแรกผ่านตารางที่มีชื่อเป็น & ทศนิยม 169 กลายเป็น © และเลขฐานสิบหก 1F600 กลายเป็น 😀 รวม <img onerror="alert(1)"> แบบดิบไว้ข้างๆ ตัวถอดรหัสส่งคืนลำดับการค้นหาแท็กนั้นเป็นอักขระสตริงธรรมดา มันไม่ได้สร้างภาพหรือดำเนินกิจกรรม เมื่อใส่ผลลัพธ์ลงในเพจจริงในภายหลัง ให้ใช้ตัวเก็บข้อความที่ปลอดภัย แทนที่จะนำสตริงที่ถอดรหัสแล้วกำหนดกลับไปยัง innerHTML

สิ่งที่วิธีการแบบตารางจะไม่ทำ - การอ้างอิงแบบไม่มีอัฒภาคแบบเดิมและลักษณะเฉพาะในการกู้คืนข้อผิดพลาดของ parser เว้นแต่จะมีการนำไปใช้โดยเจตนา

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

สิ่งนี้ไม่ครอบคลุมถึง - การฆ่าเชื้อ HTML ที่คุณตั้งใจจะแสดงผล ซึ่งเป็นปัญหาอื่น

การอ้างอิงการถอดรหัสไม่ได้ฆ่าเชื้อ HTML สำหรับการแสดงผล หากข้อความที่ถอดรหัสมีลำดับ <script> ก็จะยังคงเป็นอันตรายหากส่วนอื่นของแอปพลิเคชันแทรกในภายหลังเป็นมาร์กอัป บริบท เช่น แอตทริบิวต์ HTML สตริง JavaScript และ URL แต่ละรายการจำเป็นต้องมีการเข้ารหัสเอาต์พุตและนโยบายของตนเอง ToolAcre ส่งคืนข้อความ; มันไม่สามารถทำให้อ่างล้างจานที่ไม่ปลอดภัยในอนาคตปลอดภัยได้

ประเด็นสำคัญ: ถือว่าอินพุตเป็นเหมือนข้อมูล — วิธีที่ HTML เอนทิตี Escaper ถอดรหัสด้วยตารางการค้นหา แทนที่จะเป็น HTML parser ดังนั้นอินพุตของคุณจึงยังคงเป็นข้อความ

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