ขณะนี้ฉันกำลังปรับปรุงความปลอดภัยของไซต์ Drupal 8 โดยใช้นโยบายความปลอดภัยของเนื้อหา เนื่องจากสิ่งนี้ยังใหม่สำหรับฉัน ฉันจึงอยากได้ข้อมูลบางอย่างเกี่ยวกับกลยุทธ์ของฉัน
การตั้งค่าฐานที่เกี่ยวข้อง
การพิจารณาเบื้องต้น
ไม่อยากใช้ 'อินไลน์ไม่ปลอดภัย'
สำหรับสคริปต์หากเป็นไปได้ แต่ในที่สุดฉันก็คิดว่าสิ่งนี้จะใช้ได้กับบางเบราว์เซอร์เท่านั้น
ฉันยังต้องการมี CSP ที่เพียงพอสำหรับสถานการณ์ต่างๆ (เบราว์เซอร์ที่แตกต่างกัน เข้าสู่ระบบและไม่ได้เข้าสู่ระบบ)
สิ่งนี้ทำให้ฉันมีความคิดนี้สำหรับ สคริปต์-src
:
- โดยใช้
ไม่เคย
และ 'ไดนามิกเข้มงวด'
สำหรับเบราว์เซอร์ที่รองรับ CSP v3 และเพจที่ไม่สามารถแคชได้
- การใช้แฮชสำหรับเบราว์เซอร์ที่รองรับ CSP v3 และเพจที่แคชได้
- โดยใช้
'อินไลน์ไม่ปลอดภัย'
ร่วมกับรายการตามโดเมนสำหรับเบราว์เซอร์อื่นๆ ทั้งหมด
เหตุผลหลักที่ทำให้เบราว์เซอร์มีความแตกต่างคือฉันไม่สามารถหาวิธีสร้างคำสั่ง CSP ที่เข้ากันได้แบบย้อนกลับโดยไม่มีการเปลี่ยนแปลงโมดูลหลักและส่วนสนับสนุนในปริมาณที่ไม่สมเหตุสมผล
สิ่งที่ฉันได้ทำไปแล้วในไซต์ทดสอบในพื้นที่ของฉัน
ฉันได้เพิ่มตรรกะที่ใช้ a ไม่เคย
และ 'ไดนามิกเข้มงวด'
สำหรับเบราว์เซอร์ที่ใช้ Chrome สำหรับผู้ใช้ที่เข้าสู่ระบบ ซึ่งหน้าจะไม่ถูกแคช เพื่อให้มั่นใจว่า nonces ใหม่และไม่ซ้ำกันสำหรับทุกคำขอ ตรรกะนั้นขึ้นอยู่กับสตริงตัวแทนผู้ใช้ (ซึ่งฉันรู้ว่าไม่ปลอดภัย แต่ไม่เห็นวิธีแก้ปัญหาที่ดีกว่า)
โดยพื้นฐานแล้ว สำหรับเบราว์เซอร์ที่ใช้ Chrome ผู้ใช้ที่เข้าสู่ระบบจะได้รับส่วนหัว CSP พร้อมนโยบาย CSP ที่เกี่ยวข้องกับสคริปต์ ('อินไลน์ไม่ปลอดภัย'
ในสคริปต์-src จะถูกละเว้นโดยเบราว์เซอร์ที่รองรับ 'ไดนามิกเข้มงวด'
):
script-src 'ตัวเอง' 'ไม่ปลอดภัยในบรรทัด' *.googletagmanager.com *.google-analytics.com 'nonce-SECURENOCE' 'เข้มงวดไดนามิก';
script-src-attr 'ไม่ปลอดภัยในบรรทัด';
ผู้ใช้ที่ไม่ระบุชื่อจะได้รับ CSP ที่มีลักษณะดังนี้:
script-src 'ตัวเอง' 'ไม่ปลอดภัยในบรรทัด' *.googletagmanager.com *.google-analytics.com 'sha256-HASH_1' 'sha256-HASH_2' 'sha256-HASH_3' 'sha256-HASH_4' 'sha256-HASH_5' .. .;
script-src-attr 'ไม่ปลอดภัยในบรรทัด';
เบราว์เซอร์ที่ไม่ใช่ Chrome จะได้รับส่วนหัว CSP ที่มีลักษณะดังนี้:
script-src 'ตัวเอง' 'ไม่ปลอดภัยในบรรทัด' *.google-analytics.com *.googletagmanager.com;
ฉันได้เพิ่มตรรกะด้วย ซึ่งขึ้นอยู่กับเกณฑ์การเลือกข้างต้น เพิ่มอย่างใดอย่างหนึ่ง ไม่เคย
แอตทริบิวต์ของทุกแท็กสคริปต์ (หน้าไม่แคช) หรือรหัสแฮชสำหรับทุกแท็กสคริปต์ (หน้าแคช) นอกจากนี้ยังช่วยให้ CKEditor ทำงานได้ดีในแบ็กเอนด์
ดูเหมือนว่าจะทำงานได้ดีบนเบราว์เซอร์ต่างๆ ที่ฉันทดสอบด้วย: Brave, Chrome, Edge, Firefox และ Safari มีเพียงสามคนเท่านั้นที่มี CSP ที่ฉันถือว่าปลอดภัย (ตรวจสอบด้วย https://csp-evaluator.withgoogle.com/).
เป็นแนวทางที่ถูกต้องหรือไม่ที่จะมี:
- CSP ที่แตกต่างกันสำหรับผู้ใช้ที่เข้าสู่ระบบและผู้ใช้ที่ไม่ระบุตัวตน?
- CSP ที่แตกต่างกันสำหรับเบราว์เซอร์ที่แตกต่างกัน (หรือ "เบราว์เซอร์ที่รายงาน" ที่แตกต่างกันจริง ๆ )