Content-Security-Policy
เมตาแท็กช่วยให้คุณสามารถลดความเสี่ยงของXSSการโจมตีโดยช่วยให้คุณสามารถกำหนดทรัพยากรที่สามารถโหลดได้จากการป้องกันเบราว์เซอร์จากการโหลดข้อมูลจากสถานที่อื่น ๆ ทำให้ผู้โจมตีสามารถฉีดโค้ดที่เป็นอันตรายลงในไซต์ของคุณได้ยากขึ้น
ฉันกระแทกหัวกับกำแพงอิฐพยายามคิดว่าทำไมฉันถึงได้รับข้อผิดพลาด CSP ทีละอันและดูเหมือนจะไม่มีคำแนะนำที่กระชับและชัดเจนเกี่ยวกับวิธีการทำงานของมัน ดังนั้นนี่คือความพยายามของฉันในการอธิบายบางจุดของ CSP โดยย่อส่วนใหญ่มุ่งเน้นไปที่สิ่งที่ฉันพบว่ายากที่จะแก้ไข
เพื่อความกระชับฉันจะไม่เขียนแท็กแบบเต็มในแต่ละตัวอย่าง แต่ฉันจะแสดงเฉพาะcontent
คุณสมบัติเท่านั้นดังนั้นตัวอย่างที่ระบุว่ามีความcontent="default-src 'self'"
หมาย:
<meta http-equiv="Content-Security-Policy" content="default-src 'self'">
1. จะอนุญาตให้ใช้หลายแหล่งได้อย่างไร
คุณสามารถแสดงรายการแหล่งที่มาของคุณหลังจากคำสั่งเป็นรายการคั่นด้วยช่องว่าง:
content="default-src 'self' https://example.com/js/"
ทราบว่ามีคำพูดรอบพารามิเตอร์อื่น ๆ กว่าไม่มีพิเศษ'self'
คนเช่น นอกจากนี้ยังไม่มีเครื่องหมายทวิภาค ( :
) หลังจากคำสั่ง เพียงแค่คำสั่งแล้วรายการพารามิเตอร์คั่นด้วยช่องว่าง
ทุกอย่างด้านล่างพารามิเตอร์ที่ระบุนั้นได้รับอนุญาตโดยปริยาย ซึ่งหมายความว่าในตัวอย่างข้างต้นเหล่านี้จะเป็นแหล่งข้อมูลที่ถูกต้อง:
https://example.com/js/file.js
https://example.com/js/subdir/anotherfile.js
อย่างไรก็ตามสิ่งเหล่านี้จะไม่ถูกต้อง:
http://example.com/js/file.js
^^^^ wrong protocol
https://example.com/file.js
^^ above the specified path
2. วิธีการใช้คำสั่งต่าง ๆ พวกเขาแต่ละคนจะทำอย่างไร?
คำสั่งที่พบบ่อยที่สุดคือ:
default-src
นโยบายเริ่มต้นสำหรับการโหลดจาวาสคริปต์รูปภาพ CSS แบบอักษรคำขอ AJAX และอื่น ๆ
script-src
กำหนดแหล่งที่ถูกต้องสำหรับไฟล์จาวาสคริปต์
style-src
กำหนดแหล่งที่ถูกต้องสำหรับไฟล์ css
img-src
กำหนดแหล่งที่มาที่ถูกต้องสำหรับภาพ
connect-src
กำหนดเป้าหมายที่ถูกต้องสำหรับ XMLHttpRequest (AJAX), WebSockets หรือ EventSource หากมีการพยายามเชื่อมต่อกับโฮสต์ที่ไม่ได้รับอนุญาตที่นี่เบราว์เซอร์จะเลียนแบบ400
ข้อผิดพลาด
มีคนอื่น ๆ แต่สิ่งเหล่านี้เป็นสิ่งที่คุณต้องการมากที่สุด
3. วิธีใช้หลายคำสั่ง?
คุณกำหนดคำสั่งทั้งหมดของคุณภายในหนึ่งเมตาแท็กโดยยกเลิกพวกเขาด้วยเครื่องหมายอัฒภาค ( ;
):
content="default-src 'self' https://example.com/js/; style-src 'self'"
4. วิธีจัดการพอร์ต
ทุกอย่างยกเว้นพอร์ตเริ่มต้นจะต้องได้รับอนุญาตอย่างชัดเจนโดยการเพิ่มหมายเลขพอร์ตหรือเครื่องหมายดอกจันหลังจากโดเมนที่อนุญาต:
content="default-src 'self' https://ajax.googleapis.com http://example.com:123/free/stuff/"
ข้างต้นจะส่งผลให้:
https://ajax.googleapis.com:123
^^^^ Not ok, wrong port
https://ajax.googleapis.com - OK
http://example.com/free/stuff/file.js
^^ Not ok, only the port 123 is allowed
http://example.com:123/free/stuff/file.js - OK
ดังที่ได้กล่าวไปแล้วคุณสามารถใช้เครื่องหมายดอกจันเพื่ออนุญาตพอร์ตทั้งหมด:
content="default-src example.com:*"
5. วิธีจัดการโปรโตคอลที่แตกต่างกันอย่างไร
ตามค่าเริ่มต้นอนุญาตให้ใช้โปรโตคอลมาตรฐานเท่านั้น ตัวอย่างเช่นเพื่ออนุญาต WebSockets ws://
คุณจะต้องอนุญาตอย่างชัดเจน:
content="default-src 'self'; connect-src ws:; style-src 'self'"
^^^ web sockets are now allowed on all domains and ports
6. จะอนุญาตให้ใช้โปรโตคอลไฟล์ได้file://
อย่างไร
หากคุณจะพยายามกำหนดให้มันไม่ทำงาน คุณจะอนุญาตให้ใช้filesystem
พารามิเตอร์แทน:
content="default-src filesystem"
7. วิธีใช้สคริปต์แบบอินไลน์และนิยามสไตล์?
เว้นแต่จะได้รับอนุญาตอย่างชัดเจนคุณไม่สามารถใช้คำจำกัดความสไตล์แบบอินไลน์รหัสภายในแท็กหรือในคุณสมบัติของแท็กเช่น<script>
onclick
คุณอนุญาตให้พวกเขาชอบ:
content="script-src 'unsafe-inline'; style-src 'unsafe-inline'"
คุณจะต้องอนุญาตรูปภาพที่เข้ารหัสแบบอินไลน์ base64 อย่างชัดเจน:
content="img-src data:"
8. วิธีการอนุญาตให้eval()
?
ฉันแน่ใจว่าหลายคนจะบอกว่าคุณไม่ได้เนื่องจาก 'eval คือความชั่วร้าย' และสาเหตุที่เป็นไปได้มากที่สุดสำหรับการสิ้นสุดของโลก คนเหล่านั้นคงจะผิด แน่นอนว่าคุณสามารถเจาะรูสำคัญ ๆ ในการรักษาความปลอดภัยของไซต์ของคุณด้วย eval แต่มีกรณีการใช้งานที่ถูกต้องสมบูรณ์ คุณเพียงแค่ต้องฉลาดเกี่ยวกับการใช้มัน คุณอนุญาตเช่น:
content="script-src 'unsafe-eval'"
9. 'self'
หมายความว่าอย่างไร
คุณอาจ'self'
หมายถึง localhost, ระบบไฟล์โลคอลหรืออะไรก็ได้ในโฮสต์เดียวกัน มันไม่ได้หมายความว่าอย่างใดอย่างหนึ่ง หมายถึงแหล่งที่มีรูปแบบ (โปรโตคอล) โฮสต์เดียวกันและพอร์ตเดียวกันกับไฟล์ที่มีการกำหนดนโยบายเนื้อหาไว้ให้บริการไซต์ของคุณผ่าน HTTP หรือไม่ ไม่มี https สำหรับคุณยกเว้นกรณีที่คุณกำหนดไว้อย่างชัดเจน
ฉันใช้'self'
ในตัวอย่างส่วนใหญ่เนื่องจากปกติแล้วจะมีเหตุผลที่จะรวมไว้ แต่ก็ไม่จำเป็นต้องมี ปล่อยทิ้งไว้หากคุณไม่ต้องการ
แต่เดี๋ยวก่อน! ฉันไม่สามารถใช้content="default-src *"
และทำได้ด้วยหรือไม่
ไม่นอกจากช่องโหว่ด้านความปลอดภัยที่ชัดเจนแล้วสิ่งนี้ยังใช้งานไม่ได้ตามที่คุณคาดหวัง แม้ว่าเอกสารบางฉบับจะอ้างว่าอนุญาตอะไรก็ตามก็ไม่เป็นความจริง ไม่อนุญาตให้ใช้อินไลน์หรือหลักฐานดังนั้นเพื่อทำให้ไซต์ของคุณมีความเสี่ยงเป็นพิเศษคุณจะต้องใช้สิ่งนี้:
content="default-src * 'unsafe-inline' 'unsafe-eval'"
... แต่ฉันเชื่อว่าคุณจะไม่ทำ
อ่านเพิ่มเติม:
http://content-security-policy.com
http://en.wikipedia.org/wiki/Content_Security_Policy