เครื่องมือสำหรับนักพัฒนา · HTML ตัวหนีเอนทิตี
การถอดรหัสเอนทิตี HTML ที่ไม่มี HTML ภายใน: วิธีการทำงานของตัวถอดรหัสตารางการค้นหา
· มันทำงานอย่างไร
html ความปลอดภัย การเข้ารหัส
เคล็ดลับยอดนิยมในการถอดรหัสเอนทิตีโดยการกำหนดให้กับ innerHTML จะรันอินพุตของคุณผ่านตัวแยกวิเคราะห์ HTML ซึ่งเป็นสิ่งที่คุณไม่ต้องการอย่างแน่นอน โพสต์นี้จะอธิบายวิธีการที่ใช้ตารางที่ปลอดภัยกว่า และวิธีการจัดการการอ้างอิงที่มีชื่อ ทศนิยม และฐานสิบหก
ตัวถอดรหัสที่ดำเนินการ <img onerror> - กรณีที่เป็นรูปธรรมซึ่ง 'เพิ่งถอดรหัสมัน' กลายเป็นการเรียกใช้สคริปต์
บรรทัดเดียวทั่วไป element.innerHTML = อินพุตทำหน้าที่มากกว่าการถอดรหัส & หากอินพุตยังมี <img src=x onerror=...> เบราว์เซอร์จะสร้างองค์ประกอบรูปภาพและแอตทริบิวต์ตัวจัดการเหตุการณ์ ขึ้นอยู่กับวิธีการแนบและโหลดโหนดนั้น ซึ่งสามารถเปลี่ยนทางลัดการจัดรูปแบบเป็นการเรียกใช้สคริปต์ได้ สตริงที่มีลักษณะคล้าย HTML ที่วางไว้ควรยังคงเป็นข้อมูลเมื่องานเดียวคือการแก้ไขการอ้างอิงอักขระ ไม่ควรแยกวิเคราะห์เป็นแผนผัง DOM
สิ่งที่ InnerHTML ทำได้จริงกับสตริง — การแยกวิเคราะห์ การสร้างองค์ประกอบ และแอตทริบิวต์ตัวจัดการเหตุการณ์ ไม่ใช่แค่การแทนที่เอนทิตีเท่านั้น
innerHTML เรียกใช้ HTML parser: แท็กกลายเป็นโหนด คุณลักษณะรับความหมายของเบราว์เซอร์ และเนื้อหาข้อความในภายหลังจะตัดมาร์กอัปออกจากผลลัพธ์ แท็ก <strong> ที่คุณตั้งใจจะเก็บรักษาไว้เป็นการป้อนตามตัวอักษรอาจหายไปเมื่อจัดรูปแบบข้อความ องค์ประกอบที่แยกออกมาไม่ใช่การรับประกันความปลอดภัยโดยทั่วไป รหัสมักจะแทรกแผนผังย่อยนั้นอีกครั้งหรือใช้ผลลัพธ์ HTML ที่อื่น หากคุณต้องการแสดงอินพุตที่ไม่น่าเชื่อถือ ให้กำหนดเนื้อหาข้อความและทำความสะอาดเฉพาะเมื่อคุณตั้งใจเลือกที่จะแสดงผล HTML
วิธีการตารางการค้นหา — นิพจน์ทั่วไปสำหรับ &name;, &#NNN; และ &#xHHH; และแผนที่จากชื่อถึงตัวอักษร
ตัวถอดรหัสของ ToolAcre ใช้นิพจน์ทั่วไปที่มีขอบเขตเพื่อค้นหาการอ้างอิงของรูปแบบ &name;, { หรือ { ข้อมูลอ้างอิงที่มีชื่อจะถูกค้นหาในตารางที่ชัดเจนในทางปฏิบัติ รวมถึง amp, lt, gt, เครื่องหมายคำพูด และตัวพิมพ์ทั่วไป ชื่อที่ไม่รู้จักถูกทิ้งให้เขียนไว้แทนที่จะเดา วิธีการนี้ไม่สร้างองค์ประกอบใดๆ และเรียก no HTML parser; เพียงแทนที่สตริงย่อยที่รู้จักในสตริง ตารางนี้เป็นชุดย่อยโดยเจตนา ไม่ใช่การอ้างอิงอักขระที่มีชื่อทั้งหมด HTML
การจัดการการอ้างอิงที่เป็นตัวเลข - การแยกวิเคราะห์จุดรหัสทศนิยมและเลขฐานสิบหกและแปลงเป็นสตริงรวมถึงอักขระดาว
สำหรับการอ้างอิงที่เป็นตัวเลข ให้แยกวิเคราะห์ทศนิยมหลัง &# หรือเลขฐานสิบหกหลัง &#x จากนั้นเปลี่ยนจุดโค้ดตัวเลขให้เป็นอักขระที่มี String.fromCodePoint ค่าดวงดาว เช่น 0x1F600 จะให้ผลลัพธ์เป็นอีโมจิ ไม่ใช่อักขระที่สามารถพิมพ์แยกกันสองตัวได้ การใช้งานยังแมปค่าช่วงการควบคุม Windows-1252 ในอดีตเช่นเดียวกับที่เบราว์เซอร์ทำ ศูนย์ จุดโค้ดตัวแทนและค่าที่สูงกว่า U+10FFFF จะกลายเป็นอักขระแทนที่ การจัดการข้อผิดพลาดที่ชัดเจนนั้นช่วยป้องกันไม่ให้หมายเลขที่ไม่ถูกต้องทำให้ตัวถอดรหัสเสียหาย
ตัวอย่างการทำงาน: การถอดรหัสสตริงที่ผสม &, © และ 😀 — แต่ละการจับคู่ได้รับการแก้ไขจากตารางหรือตัวเลข
ถอดรหัสอินพุตตามตัวอักษร &, © และ 😀: การแมปอ้างอิงแรกผ่านตารางที่มีชื่อเป็น & ทศนิยม 169 กลายเป็น © และเลขฐานสิบหก 1F600 กลายเป็น 😀 รวม <img onerror="alert(1)"> แบบดิบไว้ข้างๆ ตัวถอดรหัสส่งคืนลำดับการค้นหาแท็กนั้นเป็นอักขระสตริงธรรมดา มันไม่ได้สร้างภาพหรือดำเนินกิจกรรม เมื่อใส่ผลลัพธ์ลงในเพจจริงในภายหลัง ให้ใช้ตัวเก็บข้อความที่ปลอดภัย แทนที่จะนำสตริงที่ถอดรหัสแล้วกำหนดกลับไปยัง innerHTML
สิ่งที่วิธีการแบบตารางจะไม่ทำ - การอ้างอิงแบบไม่มีอัฒภาคแบบเดิมและลักษณะเฉพาะในการกู้คืนข้อผิดพลาดของ parser เว้นแต่จะมีการนำไปใช้โดยเจตนา
วิธีการค้นหามีเจตนาไม่สร้างกฎการกู้คืนแบบไม่ใช้อัฒภาคแบบเดิมของ HTML ของ parser © โดยไม่มีเครื่องหมายอัฒภาคอาจไม่ถูกแตะต้อง ตารางที่มีชื่อคงที่ยังละเว้นการอ้างอิงที่มีชื่อ HTML5 มากกว่าสองพันรายการอีกด้วย ข้อจำกัดเหล่านั้นเป็นการแลกเปลี่ยนอย่างซื่อสัตย์สำหรับตัวถอดรหัสขนาดเล็กที่คาดเดาได้ การยอมรับเฉพาะการอ้างอิงที่ยุติอย่างชัดเจนเท่านั้นที่จะหลีกเลี่ยงการปฏิบัติต่อร้อยแก้วตามอำเภอใจที่มีเครื่องหมายแอมเพอร์แซนด์เป็นมาร์กอัป ตรวจสอบชื่อที่สนับสนุนโดยเอกสารของเครื่องมือว่าจำเป็นต้องมีความเข้ากันได้ของเบราว์เซอร์เต็มรูปแบบหรือไม่
สิ่งนี้ไม่ครอบคลุมถึง - การฆ่าเชื้อ HTML ที่คุณตั้งใจจะแสดงผล ซึ่งเป็นปัญหาอื่น
การอ้างอิงการถอดรหัสไม่ได้ฆ่าเชื้อ HTML สำหรับการแสดงผล หากข้อความที่ถอดรหัสมีลำดับ <script> ก็จะยังคงเป็นอันตรายหากส่วนอื่นของแอปพลิเคชันแทรกในภายหลังเป็นมาร์กอัป บริบท เช่น แอตทริบิวต์ HTML สตริง JavaScript และ URL แต่ละรายการจำเป็นต้องมีการเข้ารหัสเอาต์พุตและนโยบายของตนเอง ToolAcre ส่งคืนข้อความ; มันไม่สามารถทำให้อ่างล้างจานที่ไม่ปลอดภัยในอนาคตปลอดภัยได้
ประเด็นสำคัญ: ถือว่าอินพุตเป็นเหมือนข้อมูล — วิธีที่ HTML เอนทิตี Escaper ถอดรหัสด้วยตารางการค้นหา แทนที่จะเป็น HTML parser ดังนั้นอินพุตของคุณจึงยังคงเป็นข้อความ
ถือว่าอินพุตเป็นข้อมูล HTML ตัวหลีกเอนทิตีถอดรหัสด้วยตารางและเลขคณิตจุดโค้ด ไม่ใช่เคล็ดลับ HTML ภายใน ดังนั้นเพย์โหลดที่ดูมาร์กอัปยังคงเป็นอักขระเฉื่อยภายในเครื่องมือ ลองใช้ข้อมูลอ้างอิงทั้งสามรายการ จากนั้นตรวจสอบทั้งข้อความที่ถอดรหัสแล้วและวิธีที่คุณวางแผนจะใช้ต่อไป: ขอบเขตความปลอดภัยจะหายไปหากคุณแยกวิเคราะห์ใหม่เป็น HTML