อะไรคือจุดประสงค์ของแอตทริบิวต์ HTML“ nonce” สำหรับองค์ประกอบสคริปต์และสไตล์


147

W3C กล่าวว่ามีแอตทริบิวต์ใหม่ใน HTML5.1 เรียกว่าnonceสำหรับstyleและscriptที่สามารถนำมาใช้โดยนโยบายความปลอดภัยของเนื้อหาของเว็บไซต์

ฉัน googled เกี่ยวกับเรื่องนี้ แต่สุดท้ายก็ไม่เข้าใจว่าแอตทริบิวต์นี้ทำอะไรและมีการเปลี่ยนแปลงอะไรบ้างเมื่อใช้งาน


2
ดูเหมือนว่าไซต์ของคุณจะเพิ่มความปลอดภัยเพียงเล็กน้อยเท่านั้นคุณเพิ่มลงในลิงก์หรือแบบฟอร์มและเมื่อมีการแสดงเพจหาก nonce ไม่ตรงกับของคุณแสดงว่าคุณไม่ได้ให้บริการเพจ
Pete

@Pete คุณหมายความว่าไม่มีใครสามารถโหลดของคุณscriptและstyle? บางอย่างเช่นการแบน hotlink?
ATA

นอกจากนี้ยังสำหรับหน้าปกติและการตรวจสอบแบบฟอร์ม
Pete

คำตอบ:


202

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แอตทริบิวต์ซึ่งมีจำนวนตามขั้นตอนต่อไปนี้:

  1. สำหรับทุกคำขอที่เว็บเซิร์ฟเวอร์ของคุณได้รับสำหรับเอกสารเฉพาะให้แบ็กเอนด์ของคุณสร้างสตริงที่เข้ารหัสแบบสุ่ม base64 ซึ่งมีข้อมูลอย่างน้อย 128 บิตจากตัวสร้างตัวเลขสุ่มที่ปลอดภัยด้วยการเข้ารหัส เช่นEDNnf03nceIOfn39fn3e9h3sdfa. นั่นไม่ใช่ของคุณ

  2. ใช้ nonce ที่สร้างขึ้นในขั้นตอนที่ 1 และสำหรับอินไลน์script/ ที่styleคุณต้องการ "รายการที่อนุญาตพิเศษ" ให้โค้ดแบ็กเอนด์ของคุณแทรกnonceแอตทริบิวต์ลงในเอกสารก่อนที่จะส่งผ่านสายโดยมี nonce นั้นเป็นค่า:

    <script nonce="EDNnf03nceIOfn39fn3e9h3sdfa"></script>
  3. นำ 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ที่จุดที่คุณอาจรวมทั้งจะใช้เพียง


18
ไม่ใช่สำหรับการยืนยันผู้ใช้ แต่เป็นการตรวจสอบว่าเนื้อหาแบบอินไลน์ของสคริปต์หรือองค์ประกอบสไตล์ไม่ได้ถูกแทรกเข้าไปในเอกสารของบุคคลที่สาม (ที่เป็นอันตราย) ของฉัน แต่ถูกใส่ลงในเอกสารโดยเจตนาโดยใครก็ตามที่ควบคุมเซิร์ฟเวอร์เอกสาร เสิร์ฟจาก (ฉันจะอัปเดตคำตอบของฉันเพื่อบอกว่า)
sideshowbarker

3
ไม่จำเป็นต้องจัดเก็บ nonces แต่สร้างขึ้นในหน่วยความจำและแทรกลงในส่วนหัว CSP และเอกสาร HTML ที่ส่งผ่านสายในการตอบกลับ (ไม่ใช่ไปยังแหล่งที่มาที่จัดเก็บในระบบไฟล์เซิร์ฟเวอร์ / ฐานข้อมูล)
sideshowbarker

4
สำหรับเหตุผลใด ๆ ในการใช้nonceแอตทริบิวต์หากคุณไม่จำเป็นต้องใช้อย่างแท้จริงก็อย่าทำ มันมีไว้สำหรับกรณีที่คุณไม่สามารถ (ยัง) กำจัดสคริปต์อินไลน์หรือเนื้อหาสไตล์บางส่วนออกจากเอกสารเฉพาะได้ด้วยเหตุผลบางประการ (แต่ควรจะลบออกในภายหลัง) ดังนั้นหากมีเหตุผลบางอย่างที่คุณต้องเก็บสคริปต์และเนื้อหาสไตล์แบบอินไลน์ไว้ในเวลานั้นอย่างน้อยคุณก็สามารถใช้กลไก nonce เพื่อให้เบราว์เซอร์ตรวจสอบว่าใช้ได้ มิฉะนั้นคุณควรใช้ CSP อย่างเต็มที่ตามที่ตั้งใจไว้จริง ๆ และไม่อนุญาตให้ใช้สคริปต์หรือองค์ประกอบสไตล์แบบอินไลน์
sideshowbarker

2
@sideshowbarker nonce ว่างเปล่าทำอะไร? ฉันเห็นหน้า<script type="text/javascript" nonce>และ<style type="text/css" nonce>
Pacerier

8
หมายเหตุ: หากสคริปต์ของคุณเป็นแบบคงที่ฉันขอแนะนำให้ใช้แฮช CSP แทนที่จะเป็น nonce
Brian
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.