ตรวจสอบว่า CSP มีผลกับการโจมตี XSS

นโยบายรักษาความปลอดภัยเนื้อหา (CSP) ช่วยให้มั่นใจว่าเจ้าของเว็บไซต์จะเชื่อถือเนื้อหาทั้งหมดที่โหลดในหน้า CSP ช่วยลดการโจมตีแบบ Cross-site Scripting (XSS) เนื่องจากสามารถบล็อกสคริปต์ที่ไม่ปลอดภัยที่ผู้โจมตีแทรกเข้ามาได้ อย่างไรก็ตาม คุณสามารถข้าม CSP ได้อย่างง่ายดายหากไม่เข้มงวดพอ ดูข้อมูลเพิ่มเติมได้ที่ลด Cross-site Scripting (XSS) ด้วยนโยบายรักษาความปลอดภัยเนื้อหา (CSP) ที่เข้มงวด Lighthouse รวบรวม CSP ที่บังคับใช้ในเอกสารหลัก และรายงานปัญหาจาก CSP Evaluator หากข้ามได้

วันที่ คำเตือนจากรายงานของ Lighthouse ว่าไม่พบ CSP ในโหมดบังคับใช้
คำเตือนจากการรายงานของ Lighthouse ว่าไม่พบ CSP ในโหมดบังคับใช้

แนวทางปฏิบัติที่จำเป็นสำหรับ CSP ที่ข้ามไม่ได้

ทำตามแนวทางปฏิบัติต่อไปนี้เพื่อไม่ให้ข้าม CSP ได้ หากข้าม CSP ได้ Lighthouse จะแสดงคำเตือนที่มีความรุนแรงสูง

เป้าหมาย CSP XSS

หากต้องการกำหนดเป้าหมาย XSS นั้น CSP ควรมีคำสั่ง script-src, object-src และ base-uri CSP ไม่ควรมีข้อผิดพลาดทางไวยากรณ์

script-src และ object-src จะรักษาความปลอดภัยหน้าเว็บจากสคริปต์ที่ไม่ปลอดภัยและปลั๊กอินที่ไม่ปลอดภัยตามลำดับ หรือจะใช้ฟีเจอร์ default-src เพื่อกำหนดค่านโยบายแบบกว้างแทนคำสั่งหลายรายการก็ได้ ซึ่งรวมถึง script-src และ object-src

base-uri ป้องกันการแทรกแท็ก <base> ที่ไม่ได้รับอนุญาต ซึ่งสามารถใช้เปลี่ยนเส้นทาง URL ที่เกี่ยวข้องทั้งหมด (เช่น สคริปต์) ไปยังโดเมนที่ผู้โจมตีควบคุม

CSP ใช้ nonces หรือแฮชเพื่อเลี่ยงการข้ามรายการที่อนุญาต

CSP ที่กำหนดค่ารายการที่อนุญาตสำหรับ script-src อาศัยสมมติฐานที่ว่าการตอบกลับทั้งหมดที่มาจากโดเมนที่เชื่อถือนั้นปลอดภัยและสามารถเรียกใช้เป็นสคริปต์ได้ อย่างไรก็ตาม สมมติฐานนี้ไม่ได้ใช้กับแอปพลิเคชันสมัยใหม่ รูปแบบที่ไม่เป็นอันตรายที่พบได้บ่อย เช่น การแสดงอินเทอร์เฟซ JSONP และการโฮสต์สำเนาไลบรารี AngularJS ทำให้ผู้โจมตีสามารถหลบเลี่ยงขอบเขตของ CSP ได้

ในทางปฏิบัติ ผู้เขียนแอปพลิเคชันอาจไม่ทราบชัดเจน แต่ผู้โจมตีที่มีข้อบกพร่อง XSS ส่วนใหญ่สามารถหลีกเลี่ยงรายการที่อนุญาตของ script-src ได้ และแทบจะช่วยป้องกันการแทรกสคริปต์ได้เพียงเล็กน้อย ในทางตรงกันข้าม วิธีการที่อิงตาม Nonce และแฮชจะไม่ได้รับผลกระทบจากปัญหาเหล่านี้และช่วยให้ปรับใช้และดูแลนโยบายให้ปลอดภัยได้ง่ายขึ้น

ตัวอย่างเช่น โค้ดนี้ใช้ปลายทาง JSONP ที่โฮสต์บนโดเมนที่เชื่อถือได้เพื่อแทรกสคริปต์ที่ผู้โจมตีควบคุม

CSP:

script-src https://trusted.example.com

HTML:

<script src="https://trusted.example.com/path/jsonp?callback=alert(document.domain)//"></script>

CSP ควรอนุญาตสคริปต์แต่ละรายการที่ใช้ nonces หรือแฮช รวมทั้งใช้ "strict-dynamic" เพื่อหลีกเลี่ยงการถูกข้าม แทนที่จะเป็นรายการที่อนุญาต

คำแนะนำเพิ่มเติมสำหรับ CSP ที่ปลอดภัย

ใช้แนวทางปฏิบัติต่อไปนี้เพื่อเพิ่มความปลอดภัยและความเข้ากันได้ หาก CSP ไม่ทำตามคำแนะนำข้อใดข้อหนึ่ง Lighthouse จะแสดงคำเตือนความรุนแรงระดับปานกลาง

กำหนดค่าการรายงาน CSP

การกำหนดค่าปลายทางการรายงานจะช่วยตรวจสอบการหยุดทำงาน คุณตั้งค่าปลายทางการรายงานได้โดยใช้คำสั่ง report-uri หรือ report-to ขณะนี้ report-to ไม่รองรับเบราว์เซอร์ที่ทันสมัยทั้งหมด เราจึงขอแนะนำให้ใช้ทั้ง 2 อย่างหรือเพียง report-uri

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

กำหนด CSP ในส่วนหัว HTTP

คุณกำหนด CSP ในเมตาแท็กได้ดังนี้

<meta http-equiv="Content-Security-Policy" content="script-src 'none'">

อย่างไรก็ตาม คุณควรกำหนด CSP ในส่วนหัวการตอบกลับ HTTP หากทำได้ การแทรกก่อนเมตาแท็กจะข้าม CSP นอกจากนี้ เมตาแท็ก CSP ยังไม่รองรับ frame-ancestors, sandbox และการรายงาน

ตรวจสอบว่า CSP เข้ากันได้แบบย้อนหลัง

บางเบราว์เซอร์ไม่รองรับ nonces/hashes ของ CSP ดังนั้นขอแนะนำให้เพิ่ม unsafe-inline เป็นเบราว์เซอร์สำรองสำหรับเบราว์เซอร์ที่ไม่เป็นไปตามนโยบาย หากเบราว์เซอร์รองรับ nonces/hashes ระบบจะละเว้น unsafe-inline

ในทำนองเดียวกัน บางเบราว์เซอร์ไม่รองรับ strict-dynamic ขอแนะนำให้ตั้งค่ารายการที่อนุญาตเป็นตัวเลือกสำรองสำหรับเบราว์เซอร์ที่ไม่เป็นไปตามนโยบาย ระบบจะไม่สนใจรายการที่อนุญาตในเบราว์เซอร์ที่รองรับ strict-dynamic

วิธีพัฒนา CSP ที่เข้มงวด

ด้านล่างคือตัวอย่างการใช้ CSP ที่เข้มงวดซึ่งมีนโยบายที่อิงตาม Nonce

CSP:

script-src 'nonce-random123' 'strict-dynamic' 'unsafe-inline' https:;
object-src 'none';
base-uri 'none';
report-uri https://reporting.example.com;

HTML:

<script nonce="random123" src="https://trusted.example.com/trusted_script.js"></script>

random123 จะเป็นสตริง base64 ใดๆ ที่สร้างขึ้นจากฝั่งเซิร์ฟเวอร์ทุกครั้งที่โหลดหน้าเว็บ ระบบละเว้น unsafe-inline และ https: ในเบราว์เซอร์สมัยใหม่เนื่องจากค่า Nonce และ strict-dynamic ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ CSP ที่เข้มงวดได้ในคู่มือ CSP ที่เข้มงวด

คุณตรวจสอบ CSP เพื่อหาการข้ามที่อาจเกิดขึ้นได้โดยใช้ Lighthouse และ CSP Evaluator หากต้องการทดสอบ CSP ใหม่โดยไม่เสี่ยงต่อการทำให้หน้าที่มีอยู่เสียหาย ให้กำหนด CSP ในโหมดรายงานเท่านั้นโดยใช้ Content-Security-Policy-Report-Only เป็นชื่อส่วนหัว การดำเนินการนี้จะส่งการละเมิด CSP ไปยังปลายทางการรายงานที่คุณกำหนดค่าด้วย report-to และ report-uri แต่จะไม่บังคับใช้ CSP จริง