XSS ในรีแอ็กต์: dangerouslySetInnerHTML และสคริปต์จากบุคคลที่สาม
ทำความเข้าใจว่าการหลบอักขระเริ่มต้นของรีแอ็กต์ป้องกัน XSS อย่างไร dangerouslySetInnerHTML เป็นอันตรายเมื่อใด และสคริปต์จากบุคคลที่สามเพิ่มความเสี่ยงอย่างไร
XSS ในรีแอ็กต์: dangerouslySetInnerHTML และสคริปต์จากบุคคลที่สาม เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
การป้องกัน XSS ในตัวของ React
React จะเอสเคปค่าทั้งหมดที่แสดงผลผ่าน JSX โดยอัตโนมัติก่อนแทรกค่าลงใน DOM เมื่อเขียน {userInput} ใน JSX React จะเรียกใช้การกำหนดค่าแบบเดียวกับ textContent โดยถือว่าค่านั้นเป็นข้อความ ไม่ใช่ HTML วิธีนี้ช่วยป้องกันการโจมตี XSS ส่วนใหญ่ในแอปพลิเคชัน React ได้โดยค่าเริ่มต้น
สิ่งที่ dangerouslySetInnerHTML ทำ
dangerouslySetInnerHTML={{ __html: htmlString }} เป็นช่องทางยกเว้นการเอสเคปของ React ที่ข้ามการเอสเคปอัตโนมัติ ชื่อนี้ตั้งใจให้ฟังดูน่ากังวล เพื่อเตือนว่าคุณต้องรับผิดชอบต่อความปลอดภัยของสตริง HTML เอง React จะกำหนดค่าให้กับ innerHTML โดยตรง ซึ่งทำให้ HTML ใด ๆ รวมถึงสคริปต์และตัวจัดการเหตุการณ์ทำงานได้
การใช้งานที่เหมาะสม
คุณจำเป็นต้องใช้ dangerouslySetInnerHTML อย่างแท้จริงเมื่อแสดงผล HTML ที่มาจากเครื่องมือแก้ไขข้อความแบบจัดรูปแบบ (เช่น TipTap หรือ Quill), CMS ที่จัดเก็บ HTML หรือเครื่องมือแปลงมาร์กดาวน์เป็น HTML แหล่งข้อมูลเหล่านี้สร้างมาร์กอัป HTML จริงที่ต้องแสดงผลเป็น HTML ไม่ใช่ข้อความที่ถูกเอสเคป
ช่องทางการโจมตี
หากสตริง HTML มี <script>stealCookies()</script> หรือ <img src=x onerror="stealData()"> การกำหนดสตริงดังกล่าวให้เป็น innerHTML จะทำให้โค้ดของผู้โจมตีทำงาน เนื้อหาที่ผู้ใช้ส่งมาและถูกส่งตรงไปยัง dangerouslySetInnerHTML โดยไม่ผ่านการทำให้ปลอดภัย ถือเป็นช่องโหว่ XSS ระดับวิกฤต
DOMPurify: ตัวกรองมาตรฐาน
DOMPurify เป็นตัวกรอง HTML มาตรฐานของอุตสาหกรรมสำหรับเบราว์เซอร์ โดยจะแยกวิเคราะห์สตริง HTML ในบริบทแบบแซนด์บ็อกซ์ ลบองค์ประกอบและแอตทริบิวต์ที่เป็นอันตราย (แท็กสคริปต์ ตัวจัดการเหตุการณ์ และ URL ที่ใช้ javascript:) แล้วส่งคืนสตริง HTML ที่ปลอดภัย การใช้งานคือ DOMPurify.sanitize(dirtyHtml) ก่อนส่งค่าให้กับ dangerouslySetInnerHTML
ความเสี่ยงจากสคริปต์ของบุคคลที่สาม
สคริปต์จากบุคคลที่สาม (การวิเคราะห์ข้อมูล วิดเจ็ตสนทนา เครือข่ายโฆษณา) ทำงานด้วยสิทธิ์เดียวกับ JavaScript ของแอปพลิเคชัน สคริปต์ของบุคคลที่สามที่ถูกเจาะหรือเป็นอันตรายอาจอ่าน document.cookie เข้าถึง localStorage อ่านข้อมูลที่ป้อนในแบบฟอร์ม และส่งคำขอไปยังเซิร์ฟเวอร์ภายนอกได้ทั้งหมดโดยที่ผู้ใช้ไม่ทันสังเกต
นโยบายความปลอดภัยของเนื้อหาเป็นชั้นป้องกัน
นโยบายความปลอดภัยของเนื้อหาเป็นส่วนหัว HTTP ที่ประกาศว่าสคริปต์ใดได้รับอนุญาตให้ทำงาน แม้จะมีการแทรกเพย์โหลด XSS ลงใน DOM แต่ CSP ที่กำหนดค่าอย่างเหมาะสมก็สามารถบล็อกการทำงานของเพย์โหลดได้ด้วยการจำกัดสคริปต์แบบอินไลน์ และอนุญาตเฉพาะแหล่งที่มาของสคริปต์ในรายการอนุญาต CSP เป็นแนวป้องกันชั้นที่สองหลังจากการทำให้ข้อมูลที่ป้อนปลอดภัย
การโจมตีห่วงโซ่อุปทานผ่าน npm
แพ็กเกจ npm เป็นช่องทางการโจมตี XSS ที่เกิดขึ้นได้จริง การพึ่งพาอาจมีโค้ดอันตรายที่ลักลอบส่งออกตัวแปรสภาพแวดล้อมหรือข้อมูลผู้ใช้ เหตุการณ์ node-ipc ในปี 2022 และการถูกเจาะของ ua-parser-js ในปี 2021 แสดงให้เห็นว่าแพ็กเกจที่มีผู้ใช้งานอย่างแพร่หลายอาจถูกยึดและแทรกโค้ดอันตรายได้ ตรวจสอบการพึ่งพาด้วย npm audit และใช้ไฟล์ล็อก
ผู้โจมตีทำอะไรได้บ้างด้วย XSS
การโจมตี XSS ที่สำเร็จเปิดโอกาสให้ผู้โจมตีขโมยโทเค็น JWT ของผู้ใช้จาก sessionStorage (ส่งโทเค็นไปยังเซิร์ฟเวอร์ที่ผู้โจมตีควบคุม) ดำเนินการในฐานะผู้ใช้ที่ผ่านการยืนยันตัวตน (เรียก API โดยใช้เซสชันของผู้ใช้) แก้ไข DOM เพื่อแสดงเนื้อหาฟิชชิง หรือบันทึกการกดแป้นพิมพ์ทุกครั้งที่ผู้ใช้ทำในแอปพลิเคชัน
API Trusted Types
API Trusted Types ของเบราว์เซอร์กำหนดให้จุดรับข้อมูลเข้าสู่ DOM ทั้งหมด (innerHTML, eval, script.src) ต้องรับออบเจ็กต์ที่มีชนิดข้อมูลเฉพาะแทนสตริงดิบ วิธีนี้ป้องกันไม่ให้เพย์โหลด XSS ที่อยู่ในรูปสตริงไปถึง DOM ได้ในระดับแพลตฟอร์ม React กำลังพัฒนาไปสู่การรองรับ Trusted Types และ CSP สามารถบังคับใช้ข้อกำหนดนี้ได้
รูปแบบปลอดภัยสำหรับเนื้อหาจาก CMS
DOMPurify.sanitize() พร้อมรายการอนุญาตของแท็กและแอตทริบิวต์ที่ปลอดภัย จากนั้นแสดงผลด้วย dangerouslySetInnerHTML={{ __html: cleanHtml }} อย่าข้ามขั้นตอนการทำให้ข้อมูลปลอดภัย แม้จะเชื่อถือ CMS ก็ตาม เพราะฐานข้อมูลของ CMS เองก็อาจถูกเจาะได้จุดประสงค์ของ DOMPurify
เมื่อเรียกใช้ DOMPurify.sanitize(htmlString) DOMPurify จะทำอะไร
สรุปบทเรียน
React จะเอสเคปค่า JSX โดยอัตโนมัติ ซึ่งช่วยป้องกัน XSS ส่วนใหญ่ dangerouslySetInnerHTML ข้ามการป้องกันนี้เพื่อแสดงผล HTML ที่จำเป็นต่อการใช้งานจริง ดังนั้นต้องทำให้ข้อมูลที่ป้อนปลอดภัยด้วย DOMPurify ก่อนเสมอ สคริปต์จากบุคคลที่สามและแพ็กเกจ npm ที่ถูกเจาะเป็นช่องทาง XSS จากห่วงโซ่อุปทาน นโยบายความปลอดภัยของเนื้อหาเป็นชั้นป้องกันที่สอง การโจมตี XSS ที่สำเร็จทำให้เกิดการขโมยโทเค็น การสวมรอย และฟิชชิงได้
คำถามที่พบบ่อย
บทเรียน “XSS ในรีแอ็กต์: dangerouslySetInnerHTML และสคริปต์จากบุคคลที่สาม” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “XSS ในรีแอ็กต์: dangerouslySetInnerHTML และสคริปต์จากบุคคลที่สาม” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “XSS ในรีแอ็กต์: dangerouslySetInnerHTML และสคริปต์จากบุคคลที่สาม”
ทำความเข้าใจว่าการหลบอักขระเริ่มต้นของรีแอ็กต์ป้องกัน XSS อย่างไร dangerouslySetInnerHTML เป็นอันตรายเมื่อใด และสคริปต์จากบุคคลที่สามเพิ่มความเสี่ยงอย่างไร คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “XSS ในรีแอ็กต์: dangerouslySetInnerHTML และสคริปต์จากบุคคลที่สาม” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม
ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- XSS ในรีแอ็กต์: dangerouslySetInnerHTML และสคริปต์จากบุคคลที่สาม
- การป้องกัน CSRF ในรีแอ็กต์และการตั้งค่า API
- นโยบายความปลอดภัยเนื้อหาสำหรับแอปรีแอ็กต์
- การจัดการความลับและตัวแปรสภาพแวดล้อม