แพ็คเกจ spatie/laravel-CSP จัดการ nonces แบบไดนามิกสำหรับสคริปต์อินไลน์และสไตล์โดยการสร้างค่าที่ไม่ซ้ำกันต่อคำขอ HTTP และฉีดเข้าไปในส่วนหัวนโยบายความปลอดภัยเนื้อหา (CSP) โดยอัตโนมัติและองค์ประกอบ HTML ที่เกี่ยวข้อง นี่คือคำอธิบายโดยละเอียดเกี่ยวกับวิธีการทำงาน:
รุ่น nonce
- แพ็คเกจใช้อินเทอร์เฟซ nonceGenerator เพื่อสร้างสตริงที่ไม่ใช่แบบไดนามิกสำหรับแต่ละคำขอ
- โดยค่าเริ่มต้นคุณสามารถใช้คลาส Generator Nonce ของคุณเองที่ส่งคืนสตริงสุ่มที่ไม่ซ้ำกัน ตัวอย่างเช่นคุณสามารถรวมเข้ากับระบบ Nonce ของ Laravel Vite โดยการสร้างคลาสเช่น `laravelvitenonceGenerator` ซึ่งใช้` Vite :: cspnonce () `เพื่อให้ไม่ได้สร้างโดย Vite ในระหว่างการรวบรวมสินทรัพย์
- คุณระบุคลาส Generator Nonce ของคุณในคีย์ `nonce_generator 'ของไฟล์การกำหนดค่า` csp.php` ของแพ็คเกจ
การใช้งานที่ไม่ได้อยู่ในนโยบาย
-ในคลาสนโยบาย CSP ของคุณ (ซึ่งโดยทั่วไปจะขยาย `spatie \ csp \ policies \ basic`) คุณใช้วิธีการเช่น` addnoncefordirective (คำสั่ง :: สคริปต์) `และ` addnoncefordirective
- สิ่งนี้ทำให้มั่นใจได้ว่า NONCE ที่สร้างขึ้นจะรวมอยู่ในส่วนหัว CSP สำหรับคำสั่งเหล่านี้ช่วยให้สคริปต์และสไตล์อินไลน์ที่มีแอตทริบิวต์ Nonce ที่ตรงกันเพื่อดำเนินการ
มิดเดิลแวร์และการฉีดส่วนหัว
- แพ็คเกจให้มิดเดิลแวร์ (`spatie \ csp \ addcspheaders`) ที่คุณลงทะเบียนในเคอร์เนล HTTP ของคุณหรือในเส้นทางที่เฉพาะเจาะจง
- มิดเดิลแวร์นี้สร้าง Nonce สำหรับคำขอใช้นโยบาย CSP รวมถึงคำสั่งที่ไม่ได้รับและเพิ่มส่วนหัว CSP ที่เหมาะสมในการตอบกลับ HTTP
- ค่า nonce สอดคล้องกันภายในคำขอดังนั้นคุณสามารถใช้คำสั่งใบมีดเช่น `@nonce` หรือฟังก์ชั่นผู้ช่วยเช่น` csp_nonce () `ในมุมมองของคุณเพื่อส่งออกแอตทริบิวต์ nonce บนแท็กอินไลน์` `` ``
การรวมเข้ากับ laravel vite
- เมื่อใช้ Laravel Vite แพ็คเกจสามารถใช้ประโยชน์จากการสร้างที่ไม่ได้อยู่ในตัวของ Vite ผ่าน `vite :: cspnonce ()`
- คุณสามารถสร้างคลาส Generator ที่กำหนดเองที่ส่งคืน Nonce จาก VITE เพื่อให้มั่นใจว่า NONCE ที่ใช้ในส่วนหัว CSP นั้นตรงกับ NONCE ที่ใช้กับสคริปต์และสไตล์ Vite-injected
- สิ่งนี้จะหลีกเลี่ยงการละเมิด CSP ที่เกิดจากความไม่ตรงกันและอนุญาตให้ใช้สคริปต์/สไตล์อินไลน์ที่ปลอดภัยในแอพ Laravel ที่ใช้พลังงาน VITE
คุณสมบัติเพิ่มเติม
- แพ็คเกจยังรองรับนโยบาย CSP ในการแสดงผลเป็น Meta Tags (ผ่าน `@cspmetatag` Directive Blade 'Directive) เมื่อคุณไม่สามารถควบคุมส่วนหัว HTTP ได้
- รองรับโหมดรายงานอย่างเดียวสำหรับการทดสอบนโยบาย CSP โดยไม่ต้องปิดกั้นทรัพยากร
- คุณสามารถปรับแต่งนโยบายสำหรับสภาพแวดล้อมที่แตกต่างกัน (การพัฒนาเทียบกับการผลิต)
บันทึกการปฏิบัติ
- คุณต้องตรวจสอบให้แน่ใจว่า nonce เป็นเอาต์พุตบนสคริปต์อินไลน์/สไตล์โดยใช้ใบมีด `@nonce` directive หรือ` csp_nonce () `ผู้ช่วย; มิฉะนั้นเบราว์เซอร์จะบล็อกพวกเขา
- เบราว์เซอร์เช่น Chrome อาจตัดแอตทริบิวต์ nonce ออกจากแท็กสคริปต์ที่ฉีดแบบไดนามิกดังนั้นให้ใช้อย่างระมัดระวังและพฤติกรรมทดสอบ
- NONCE เป็นสตริงแบบสุ่มที่สร้างขึ้นตามคำขอทำให้สคริปต์/สไตล์แบบอินไลน์ปลอดภัยยิ่งขึ้นโดยอนุญาตให้เฉพาะผู้ที่มีการทำงานที่ไม่ถูกต้องเท่านั้น
โดยสรุป spatie/laravel-CSP สร้างแบบไดนามิกแบบไดนามิกต่อคำขอผ่านเครื่องกำเนิดที่ไม่สามารถกำหนดค่าได้รวมถึง nonce นี้ในส่วนหัว CSP สำหรับสคริปต์และสไตล์และให้คำสั่งใบมีด การบูรณาการนี้โดยเฉพาะอย่างยิ่งกับ Laravel Vite ทำให้มั่นใจได้ว่าสคริปต์และรูปแบบแบบอินไลน์ได้รับอนุญาตอย่างปลอดภัยโดย CSP โดยไม่ต้องใช้การอินไลน์ที่ไม่ปลอดภัยเพิ่มความปลอดภัยของแอปพลิเคชันในขณะที่ยังคงใช้งานได้ [1] [2] [3] [4] [6]
การอ้างอิง:
[1] https://github.com/spatie/laravel-csp
[2] https://laravel.io/forum/laravel-mix-and-content-security-policy
[3] https://laravel-news.com/package/spatie-laravel-csp
[4] https://stackoverflow.com/questions/75106343/nonce-is-always-empty-when-using-spatie-laravel-csp-with-laravel-and-vite-js
[5] https://github.com/spatie/laravel-csp/discussions/96
[6] https://stackoverflow.com/questions/77459507/how-to-add-csp-nonce-in-in-inline-style-and-scripted-by-vue-in-in-laravel-and
[7] https://www.stackhawk.com/blog/laravel-content-security-policy-guide-what-it-is-and-how-to-enable-it/
[8] https://stackoverflow.com/questions/78864184/enable-nonce-to-laravel-ofofficial-packages
[9] https://developer.mozilla.org/en-us/docs/web/http/headers/content-security-policy/script-src