nonce
แอตทริบิวต์ช่วยให้คุณสามารถ“รายการที่อนุญาต” อินไลน์บางscript
และstyle
องค์ประกอบในขณะที่หลีกเลี่ยงการใช้ CSP unsafe-inline
สั่ง (ซึ่งจะช่วยให้ทุกแบบอินไลน์script
/ style
) เพื่อให้คุณยังคงรักษาคุณลักษณะที่สำคัญของซีเอสพีไม่อนุญาตให้อินไลน์script
/ style
ทั่วไป
ดังนั้นnonce
แอตทริบิวต์จึงเป็นวิธีการบอกเบราว์เซอร์ว่าเนื้อหาแบบอินไลน์ของสคริปต์หรือองค์ประกอบลักษณะเฉพาะไม่ได้ถูกแทรกเข้าไปในเอกสารโดยบุคคลที่สาม (ที่เป็นอันตราย) บางราย แต่ถูกใส่ลงในเอกสารโดยเจตนาโดยใครก็ตามที่ควบคุมเซิร์ฟเวอร์ที่ให้บริการเอกสาร จาก.
https://developers.google.com/web/fundamentals/security/csp/#if_you_absolutely_must_use_itเป็นตัวอย่างที่ดีเกี่ยวกับวิธีใช้nonce
แอตทริบิวต์ซึ่งมีจำนวนตามขั้นตอนต่อไปนี้:
สำหรับทุกคำขอที่เว็บเซิร์ฟเวอร์ของคุณได้รับสำหรับเอกสารเฉพาะให้แบ็กเอนด์ของคุณสร้างสตริงที่เข้ารหัสแบบสุ่ม base64 ซึ่งมีข้อมูลอย่างน้อย 128 บิตจากตัวสร้างตัวเลขสุ่มที่ปลอดภัยด้วยการเข้ารหัส เช่นEDNnf03nceIOfn39fn3e9h3sdfa
. นั่นไม่ใช่ของคุณ
ใช้ nonce ที่สร้างขึ้นในขั้นตอนที่ 1 และสำหรับอินไลน์script
/ ที่style
คุณต้องการ "รายการที่อนุญาตพิเศษ" ให้โค้ดแบ็กเอนด์ของคุณแทรกnonce
แอตทริบิวต์ลงในเอกสารก่อนที่จะส่งผ่านสายโดยมี nonce นั้นเป็นค่า:
<script nonce="EDNnf03nceIOfn39fn3e9h3sdfa">…</script>
นำ nonce ที่สร้างขึ้นในขั้นตอนที่ 1 nonce-
มาไว้ข้างหน้าและทำให้แบ็กเอนด์ของคุณสร้างส่วนหัว CSP พร้อมกับค่าของรายการต้นทางสำหรับscript-src
หรือstyle-src
:
Content-Security-Policy: script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa'
ดังนั้นกลไกการใช้ nonce จึงเป็นอีกทางเลือกหนึ่งในการให้แบ็กเอนด์ของคุณสร้างแฮชของเนื้อหาแบบอินไลน์script
หรือstyle
คุณต้องการอนุญาตจากนั้นระบุแฮชนั้นในรายการต้นทางที่เหมาะสมในส่วนหัว CSP ของคุณ
โปรดทราบว่าเนื่องจากเบราว์เซอร์ไม่ (ไม่สามารถ) ตรวจสอบได้ว่าค่า nonce ส่งการเปลี่ยนแปลงระหว่างคำขอหน้าเว็บจึงเป็นไปได้แม้ว่าจะมองไม่เห็นโดยสิ้นเชิงก็ตามหากต้องการข้าม 1 ด้านบนและไม่มีแบ็กเอนด์ของคุณทำอะไรแบบไดนามิกสำหรับ nonce ซึ่งในกรณีนี้คุณ สามารถใส่nonce
แอตทริบิวต์ที่มีค่าคงที่ลงในซอร์ส HTML ของเอกสารของคุณและส่งส่วนหัว CSP แบบคงที่ที่มีค่า nonce เดียวกัน
แต่เหตุผลที่คุณไม่ต้องการใช้ nonce แบบคงที่ในลักษณะนั้นก็คือมันค่อนข้างจะเอาชนะจุดประสงค์ทั้งหมดของการใช้ nonce ไปเลยในการเริ่มต้นเพราะถ้าคุณจะใช้ nonce แบบคงที่แบบนั้น unsafe-inline
ที่จุดที่คุณอาจรวมทั้งจะใช้เพียง