Content-Security-Policy เชิงลึก
Content-Security-Policy คืออะไร
Content-Security-Policy (CSP) เป็นเลเยอร์ลดความเสียหายเมื่อมี XSS หรือการโหลดทรัพยากรไม่พึงประสงค์ เบราว์เซอร์บังคับนโยบายตามที่เซิร์ฟเวอร์ส่งใน header เอกสารหลักอยู่ที่ MDN: Content Security Policy และ CSP Level 3
ไดเรกทิฟที่ใช้บ่อย
default-srcเป็นค่าสำรองเมื่อไม่ได้ระบุชนิดทรัพยากรscript-src/style-srcควบคุมสคริปต์และสไตล์img-src,connect-src,font-srcควบคุมรูป, fetch/XHR และฟอนต์frame-ancestorsควบคุมว่าหน้านี้ถูกฝังในเฟรมที่ไหนได้บ้าง (แทน X-Frame-Options)base-uriและform-actionจำกัดฐาน URL และการส่งฟอร์ม
nonce และ hash ดีกว่า unsafe-inline
'unsafe-inline' ใน script-src ทำให้ CSP ป้องกัน XSS ได้น้อยมาก แนวทางที่ OWASP แนะนำใน CSP Cheat Sheet คือใช้ nonce แบบสุ่มต่อคำตอบ หรือ hash ของสคริปต์อินไลน์ที่รู้ชุดแล้ว
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-rAnd0m123'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'วิธีนำมาใช้โดยไม่ทำให้เว็บพัง
1. เริ่มด้วย Content-Security-Policy-Report-Only
2. เก็บรายงานจาก report-to หรือ endpoint รายงาน
3. ไล่ลดแหล่งที่มาที่ไม่จำเป็น
4. สลับเป็น enforce เมื่อรายงานเหลือแต่ที่ตั้งใจ
อย่าพึ่ง CSP เป็นการป้องกัน XSS เพียงอย่างเดียว ต้องมี encoding ผลลัพธ์และกรอบพัฒนาที่ปลอดภัยตาม OWASP XSS Prevention
สรุป
CSP ที่ดีแคบพอจะกันสคริปต์แปลกปลอม แต่กว้างพอให้แอปทำงานได้ ออกแบบร่วมกับทีมฟรอนต์เอนด์ ไม่ใช่คัดลอกนโยบายจากเว็บอื่นมาทั้งก้อน