Score:1

เป็นแนวทางที่ถูกต้องหรือไม่ที่จะมี CSP ที่แตกต่างกันตามสถานะการเข้าสู่ระบบและเบราว์เซอร์

ธง bd

ขณะนี้ฉันกำลังปรับปรุงความปลอดภัยของไซต์ Drupal 8 โดยใช้นโยบายความปลอดภัยของเนื้อหา เนื่องจากสิ่งนี้ยังใหม่สำหรับฉัน ฉันจึงอยากได้ข้อมูลบางอย่างเกี่ยวกับกลยุทธ์ของฉัน

การตั้งค่าฐานที่เกี่ยวข้อง

  • Drupal 8 พร้อมแพตช์แบบกำหนดเองที่สร้าง ckeditor.js ส่งผ่าน nonce เมื่อโหลดปลั๊กอิน CKEditor จะถูกใช้โดยผู้ใช้ที่เข้าสู่ระบบเท่านั้น
  • ชุดรักษาความปลอดภัยแพตช์เพื่อให้ hook ดัดแปลงสำหรับคำสั่ง CSP (https://www.drupal.org/project/seckit/issues/2844205#comment-14217383).
  • โค้ดแบบกำหนดเองสำหรับแก้ไข HTML ที่แสดงผลและการกำหนดค่า CSP จากโมดูล Security Kit

การพิจารณาเบื้องต้น

ไม่อยากใช้ 'อินไลน์ไม่ปลอดภัย' สำหรับสคริปต์หากเป็นไปได้ แต่ในที่สุดฉันก็คิดว่าสิ่งนี้จะใช้ได้กับบางเบราว์เซอร์เท่านั้น ฉันยังต้องการมี 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/).

เป็นแนวทางที่ถูกต้องหรือไม่ที่จะมี:

  1. CSP ที่แตกต่างกันสำหรับผู้ใช้ที่เข้าสู่ระบบและผู้ใช้ที่ไม่ระบุตัวตน?
  2. CSP ที่แตกต่างกันสำหรับเบราว์เซอร์ที่แตกต่างกัน (หรือ "เบราว์เซอร์ที่รายงาน" ที่แตกต่างกันจริง ๆ )
cn flag
รู้สึกเหมือนว่าคำถามหลักของคุณจะนำไปใช้กับเว็บไซต์ใด ๆ แทนที่จะเป็น Drupal โดยเฉพาะ? ขอโทษถ้าฉันผิดที่นั่น แต่ถ้าเป็นเช่นนั้น วิธีนี้อาจเหมาะกับ (และที่สำคัญกว่านั้นคือจะได้คำตอบที่ดีกว่า) Stack Overflow
berliner avatar
bd flag
@Clive คุณอาจพูดถูก ฉันหวังว่า CSP อาจเป็นหัวข้อสำหรับคนทั่วไปของ Drupal และฉันก็หวังว่าจะมีคนยืนยันหรือโต้แย้งแนวทางของฉันในบริบทเฉพาะของ Drupal
Score:3
ธง th
  1. การพึ่งพาตัวแทนผู้ใช้นั้นไม่น่าเชื่อถือ ตัวอย่างเช่น ฉันเปลี่ยนตัวแทนผู้ใช้ในเบราว์เซอร์เก่าของฉัน มิฉะนั้น YouTube ปฏิเสธที่จะทำงาน ตามผลการวิเคราะห์รายงานการละเมิด หากคุณเปลี่ยน CSP สำหรับตัวแทนผู้ใช้ของฉัน ผู้ใช้ที่ถูกต้องของเบราว์เซอร์นี้อาจได้รับผลกระทบ

  2. การใช้ script-src-attr 'ไม่ปลอดภัยในบรรทัด'; จะเปิดประตูสำหรับ XSS ในเบราว์เซอร์ที่ใช้ Chromium เนื่องจากจะอนุญาตให้ตัวจัดการเหตุการณ์ในแท็ก (เช่น onckick = "แจ้งเตือน ('XSS')").

  3. การใช้ 'sha256-แฮช' เป็น ไม่ รองรับสำหรับ ภายนอก สคริปต์ใน Safari/Firefox หากคุณใช้สำหรับอินไลน์ <script> แท็กเท่านั้น ใช้งานง่ายกว่า 'ค่าแฮช' สำหรับผู้ใช้ที่เข้าสู่ระบบและไม่ได้เข้าสู่ระบบ (และไม่ใช้ 'นอนเซ่').
    คุณสามารถใช้ผสม 'ไม่ใช่-' และ 'sha256-' แต่ในกรณีของ XSS 'ไม่ใช่-' สามารถใช้ซ้ำได้ในหน้าแคชของเบราว์เซอร์ (ซึ่งเป็นเรื่องยากและไม่น่าเป็นไปได้)

โดยสังเขป คุณสามารถใช้ CSP ในโหมดความเข้ากันได้ย้อนหลังของเบราว์เซอร์:

script-src 'ตัวเอง' 'ไดนามิกเข้มงวด' *.googletagmanager.com *.google-analytics.com
  'sha256-HASH_1' 'sha256-HASH_2' ...;

หรือ

script-src 'ตัวเอง' 'ไดนามิกเข้มงวด' *.googletagmanager.com *.google-analytics.com 'nonce-SECURENOCE';
  • รองรับ Chrome/Edge/Firefox 'เข้มงวด dinamic' (ซึ่งยกเลิกแหล่งที่มาตามโฮสต์) ดังนั้น CSP จริงจะเป็น script-src 'เข้มงวดไดนามิก' 'sha256-HASH_1' 'sha256-HASH_2' ...; หรือ script-src 'เข้มงวดไดนามิก' 'nonce-SECURENOCE'; ตามลำดับ

  • Safari ไม่รองรับ 'เข้มงวด dinamic'ดังนั้น CSP จริงจะเป็น script-src 'ตัวเอง' *.googletagmanager.com *.google-analytics.com 'sha256-HASH_1' 'sha256-HASH_2' ...; หรือ script-src 'ตัวเอง' *.googletagmanager.com *.google-analytics.com 'nonce-SECURENONCE'; ตามลำดับ

  • คุณไม่จำเป็นต้องใช้ 'อินไลน์ไม่ปลอดภัย' เลยเพราะยกเลิกโดย 'ค่าที่ไม่ใช่ค่า' หรือ 'ค่าแฮช' ถึงอย่างไร. สำหรับตอนนี้ไม่มีเบราว์เซอร์ที่ไม่รองรับ 'ค่าที่ไม่ใช่ค่า' / 'ค่าแฮช'.

CSP ข้างต้นไม่อนุญาตให้ใช้ตัวจัดการเหตุการณ์แบบอินไลน์ในแท็ก แต่:

  1. CKEditor-5 ทำ ไม่ต้องการ 'อินไลน์ไม่ปลอดภัย' และสามารถอนุญาตด้วย nonce/hash เดอะ 'อินไลน์ไม่ปลอดภัย' จำเป็นสำหรับ CKEditor-4 เท่านั้น

  2. ไม่จำเป็นต้องใช้ Google Analytics 'อินไลน์ไม่ปลอดภัย' และสามารถอนุญาตด้วย nonce/hash

  3. Google Tag Manager ไม่จำเป็นต้องใช้ 'อินไลน์ไม่ปลอดภัย' และสามารถอนุญาตด้วย nonce/hash เดอะ 'อินไลน์ไม่ปลอดภัย' สำหรับ GTM จำเป็นต่อเมื่อคุณใช้สคริปต์แบบอินไลน์ที่กำหนดเองใน "แท็ก HTML ที่กำหนดเอง"
    ใช้ก 'ค่าที่ไม่ใช่ค่า' อาจเป็นที่ต้องการเพราะถ้าสคริปต์ GTM ถูกแทรกด้วย โนเน่= แอตทริบิวต์จะถูกแจกจ่ายซ้ำไปยังสคริปต์ทั้งหมดที่แทรกโดยเครื่องจัดการแท็ก ยกเว้น "แท็ก HTML ที่กำหนดเอง"

  4. หากคุณใช้ตัวจัดการเหตุการณ์แบบอินไลน์ในแท็ก - an 'อินไลน์ไม่ปลอดภัย' เป็นสิ่งจำเป็นดังนั้นอย่าลืม 'นอนเซ่', 'แฮช' และ 'ไดนามิกเข้มงวด' โทเค็น ตั้งแต่ 'แฮชที่ไม่ปลอดภัย' ไม่รองรับ Safari คุณไม่มีทางอนุญาตตัวจัดการเหตุการณ์แบบอินไลน์ในแท็กได้อย่างปลอดภัย

berliner avatar
bd flag
Thanks for this extensive answer. I have doubts about the next steps though. My idea was to provide a maximum of security for modern browsers and not taking the low bar only because less modern browsers don't support it. Safari for example understands nonces, but doesn't understand `strict-dynamic`, which makes it impossible (in a Drupal context) to have a functioning backend. Hashes on the other hand don't allow CSP "inheritance" like nonces do with `strict-dynamic` (afaik). And in Drupal which still comes bundled with CKEditor 4, I honestly don't see a way of getting around 'unsafe-inline'.
berliner avatar
bd flag
So is it inherently bad to provide different CSP rules based on the user agent even if it's not reliable? From my understanding, the low-bar CSP rules would apply always as a baseline, but user agents reporting as modern, would still get more secure rules. I don't see how that would create a problem.

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา