เผยแพร่: 17 พฤศจิกายน 2025
ตั้งแต่ Chrome 141 เป็นต้นไป คุณสามารถเข้าร่วมช่วงทดลองใช้แหล่งที่มาเพื่อทดสอบฟีเจอร์ใหม่ของนโยบายความปลอดภัยของเนื้อหา (CSP) ที่ Chrome กำลังจะเปิดตัว ฟีเจอร์เหล่านี้ช่วยให้เว็บไซต์ ปกป้องตนเองจาก XSS ได้โดยการอนุญาตแหล่งที่มาที่รู้จักของ JavaScript ได้ดียิ่งขึ้น การอนุญาตพิเศษสำหรับ JavaScript ที่รู้จักและบล็อกแหล่งที่มาอื่นๆ ทั้งหมดเป็นวิธีที่มีประสิทธิภาพในการป้องกัน XSS JavaScript ที่ผู้โจมตีแทรกจะไม่ปรากฏใน รายการที่อนุญาต จึงถูกบล็อก
หากไม่มีฟีเจอร์เหล่านี้ การมี CSP แบบ "เข้มงวด" ที่อนุญาตพิเศษ แหล่งที่มาของ JavaScript ทั้งหมดโดยไม่มีกลไกการสื่อสารแบบ Nonce ระหว่าง โฮสต์สคริปต์กับเว็บไซต์ หรือการทราบแฮชแบบเต็มของสคริปต์ล่วงหน้าเป็นเรื่องยาก ทั้ง 2 วิธีนี้ปรับใช้ได้ยากหากสคริปต์มีการเปลี่ยนแปลงบ่อยและโฮสต์โดยบุคคลที่สามที่เชื่อถือได้แต่แยกต่างหาก นอกจากนี้ หากสคริปต์ใดต้องใช้ eval ปัจจุบัน CSP กำหนดให้คุณต้องเพิ่ม eval ลงในรายการที่อนุญาต สำหรับสคริปต์ทั้งหมด ซึ่งทำให้มีความปลอดภัยน้อยลงมาก
เราพยายามที่จะอุดช่องโหว่นี้ด้วยการจัดหากลไกที่แข็งแกร่งยิ่งขึ้นสำหรับ
การอนุญาตพิเศษตาม URL ของสคริปต์ใน script-src และกลไกสำหรับ
การอนุญาตพิเศษให้เรียกใช้ฟังก์ชัน eval คุณจะใช้กลไกแฮชที่มีอยู่แล้วใน
script-src เพื่ออนุญาต URL ของสคริปต์ที่เฉพาะเจาะจง และ JavaScript ที่ส่งไปยัง
eval (และฟังก์ชันอื่นๆ ที่คล้ายกับ eval) ได้ แม้ว่าการอนุญาตตาม URL อาจไม่เข้มงวดเท่า CSP ที่อิงตามความสมบูรณ์ แต่วิธีการนี้ควรเป็นการปรับปรุงที่ยอดเยี่ยมสำหรับรายการที่อนุญาตชื่อโฮสต์ที่มีอยู่
เราเชื่อว่าวิธีนี้จะช่วยให้การใช้นโยบาย CSP ง่ายขึ้น แต่ยังคงช่วยลด XSS ได้อย่างมีประสิทธิภาพ โดยการบล็อกสคริปต์แบบอินไลน์และสคริปต์ eval ที่ไม่อนุญาต ฟีเจอร์ใหม่เหล่านี้ ได้รับการออกแบบและติดตั้งใช้งานอย่างรอบคอบเพื่อให้เว็บไซต์ตั้งค่านโยบายที่ รักษาความปลอดภัยได้ดียิ่งขึ้นในเบราว์เซอร์ที่รองรับฟังก์ชันการทำงานใหม่ โดยไม่ ทำให้เกิดการหยุดทำงานหรือลดระดับความปลอดภัยในเบราว์เซอร์ที่ไม่รองรับ โดยไม่ต้อง ใช้การดมกลิ่น User-Agent
กรณีการใช้งาน
เพิ่ม URL ที่เฉพาะเจาะจงลงในรายการที่อนุญาตเพื่อใช้กับ script-src
เว็บไซต์ที่ต้องการเพิ่มสคริปต์ที่เฉพาะเจาะจงลงในรายการที่อนุญาตเพื่อใช้กับ script-src ในปัจจุบัน
มี 2 ตัวเลือก ได้แก่ เพิ่มเนื้อหาของสคริปต์ลงในรายการที่อนุญาตผ่านการตรวจสอบความสมบูรณ์ของทรัพยากรย่อย
(SRI) หรือใช้ host-source เพื่อเพิ่มชื่อโฮสต์ลงในรายการที่อนุญาต SRI มักไม่เหมาะกับ
สคริปต์ที่เปลี่ยนแปลงบ่อย (เช่น สคริปต์วิเคราะห์) ระบบจะเพิกเฉยต่อการระบุ
โฮสต์ต้นทางเมื่อตั้งค่า strict-dynamic ด้วย และไม่ใช่การป้องกันที่ครอบคลุมเนื่องจากไม่มีพารามิเตอร์ URL การเปลี่ยนแปลงนี้
จะอนุญาตสคริปต์ในรายการที่อนุญาตโดยใช้แฮชของ URL (แบบเต็ม) ซึ่งรองรับ
ทั้งสคริปต์แบบไดนามิกและการกำหนดค่าที่ใช้ strict-dynamic
อนุญาตสคริปต์ที่เฉพาะเจาะจงเพื่อใช้กับฟังก์ชัน eval หรือฟังก์ชันที่คล้ายกับ eval
บางเว็บไซต์กำหนดให้ใช้ฟังก์ชัน eval หรือฟังก์ชันที่คล้ายกับ eval (ส่งโค้ดเป็น
สตริงลิเทอรัลใน setTimeout, setInterval และ setImmediate) สำหรับเว็บไซต์เหล่านี้
ตัวเลือก CSP เดียวที่ใช้ได้คือ unsafe-eval ซึ่งเปิดใช้การเรียกทั้งหมด
ไปยัง eval เรากำลังเพิ่มกลไกเพื่ออนุญาตอินพุตที่เฉพาะเจาะจงไปยังฟังก์ชัน eval กลไกใหม่นี้ช่วยให้คุณอนุญาตพิเศษเฉพาะสคริปต์ที่จำเป็นได้โดยการแฮชเนื้อหาของสคริปต์โดยตรง แทนที่จะต้องระบุ CSP ที่มี unsafe-eval ที่กว้างเกินไป
เริ่มต้นใช้งาน
หากต้องการลองใช้การรองรับการแฮชสคริปต์และฟังก์ชัน eval ให้เข้าร่วม
ช่วงทดลองใช้ URL และแฮชฟังก์ชัน eval ใน CSP script-src จากต้นทาง
ซึ่งจะเริ่มตั้งแต่ Chrome 141 ถึง 144
เพิ่มแฮชไปยัง script-src
ระบบจะเพิ่ม URL ลงในรายการที่อนุญาตโดยการเพิ่มค่าลงในคำสั่ง CSP script-src ในรูปแบบ url-<hash-algorithm>-<script-url-hash> ซึ่งจะอนุญาตให้เนื้อหาใดก็ตามที่ URL นั้นแสดงดำเนินการได้ ไม่ว่าจะเป็นเนื้อหาใดก็ตาม แฮชต้องมีเฉพาะ URL เริ่มต้น (URL ที่รวมอยู่ในหน้าเว็บ) เท่านั้น ไม่ใช่ URL ที่ URL นั้นเปลี่ยนเส้นทางไป รองรับทั้ง URL แบบสมบูรณ์และแบบสัมพัทธ์
ตัวอย่างเช่น ส่วนหัว CSP ต่อไปนี้จะอนุญาตพิเศษสำหรับสคริปต์ที่แสดงที่ https://example.com/example.js
Content-Security-Policy: script-src 'sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc=';
โดยที่ 'sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc=' คือแฮช sha256
ของ 'https://example.com/example.js'
สคริปต์ที่ประเมินผ่าน eval หรือ new Function สามารถเพิ่มลงในรายการที่อนุญาตได้โดย
รวม eval-<hash-algorithm>-<script-contents-hash> ไว้ใน src ของสคริปต์ ตัวอย่างเช่น ส่วนหัว CSP ต่อไปนี้จะอนุญาตให้ส่งสตริง
alert("hello world") ไปยัง eval()
Content-Security-Policy: script-src 'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0=';
โดยที่ 'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0=' คือแฮช sha256
ของ alert("hello world")
เมื่อเว็บไซต์เลือกใช้ Origin Trial ระบบจะพิมพ์แฮชสำหรับทั้ง URL และ eval ไปยังคอนโซล DevTools และรวมไว้ในรายงาน CSP เพื่อช่วยกระตุ้นการใช้งาน ซึ่งหมายความว่าสามารถใช้นโยบายที่เข้มงวดแต่report-onlyเพื่อแจงนับ
แฮชทั้งหมดที่จำเป็นสำหรับการอนุญาตพิเศษ
รักษาความเข้ากันได้แบบย้อนหลัง
หากต้องการอนุญาตให้ติดตั้งใช้งานนโยบายเหล่านี้ก่อนที่เบราว์เซอร์ทั้งหมดจะเพิ่มการรองรับ คุณจะแสดงแฮช URL หลังจากรายการที่อนุญาตตามโฮสต์ได้ เบราว์เซอร์ที่เข้าใจ แฮชประเภทใหม่จะละเว้นรายการที่อนุญาตตามโฮสต์ที่อยู่ก่อนหน้า ในขณะที่เบราว์เซอร์ ที่ไม่เข้าใจแฮชประเภทใหม่จะยังคงบังคับใช้รายการที่อนุญาตตามโฮสต์ ต่อไป ทำให้เว็บไซต์ตั้งค่าทั้ง 2 อย่างได้ โดยใช้นโยบายที่เข้มงวดกว่าในเบราว์เซอร์ ที่รองรับโดยไม่ต้องเสี่ยงต่อการหยุดทำงานในเบราว์เซอร์ที่ไม่รองรับ ดังที่แสดงในตัวอย่างต่อไปนี้
Content-Security-Policy: script-src 'https:' 'url-sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc='
นอกจากนี้ เรายังได้เปิดตัว strict-dynamic-url ซึ่งเทียบเท่ากับ strict-dynamic ที่ ใช้ได้เฉพาะเมื่อตั้งค่าแฮช URL เท่านั้น เนื่องจาก strict-dynamic ทำให้ระบบไม่สนใจรายการที่อนุญาตตามโฮสต์ เว็บไซต์ที่ต้องการอนุญาตแฮชที่เฉพาะเจาะจงและใช้ strict-dynamic กับแฮชนั้นสามารถใช้นโยบายต่อไปนี้
Content-Security-Policy: https: 'strict-dynamic-url' 'url-sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc='
ในตัวอย่างนี้ เบราว์เซอร์ที่ยังไม่รองรับแฮชจะบังคับใช้เฉพาะ
https: unsafe-eval จะถูกเบราว์เซอร์ที่รองรับละเว้นในลักษณะเดียวกันเมื่อมีแฮช eval ตัวอย่างเช่น นโยบายต่อไปนี้จะได้รับการประเมินเป็น
unsafe-eval ซึ่งจะช่วยให้ใช้ eval() ทั้งหมดในเบราว์เซอร์ที่ยังไม่รองรับแฮช eval ได้
ในขณะที่อนุญาตเฉพาะ eval() ของ alert("hello world")
ในเบราว์เซอร์ที่รองรับแฮช eval
Content-Security-Policy: script-src "unsafe-eval" "'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0='"
แชร์ความคิดเห็น
เราสนใจรับฟังความคิดเห็นจากนักพัฒนาแอปเกี่ยวกับส่วนขยายเหล่านี้ใน
script-src โพสต์ความคิดเห็นเป็นปัญหาในคำอธิบายใน
github