MIME Sniffing และ X-Content-Type-Options
MIME sniffing คืออะไร
เบราว์เซอร์บางรุ่นเคยเดาชนิดไฟล์จากเนื้อหาจริง แม้เซิร์ฟเวอร์จะส่ง Content-Type อีกอย่าง หากไฟล์ที่ผู้ใช้อัปโหลดถูกเสิร์ฟเป็นสคริปต์ได้ อาจเกิด XSS ได้ header X-Content-Type-Options: nosniff สั่งให้เบราว์เซอร์เคารพชนิดที่ประกาศ
คำอธิบายพฤติกรรมปัจจุบันอยู่ที่ MDN: X-Content-Type-Options และอัลกอริทึมที่เกี่ยวข้องใน WHATWG MIME Sniffing
ค่าที่ถูกต้อง
ส่งได้ค่าเดียวที่มีความหมายในทางปฏิบัติ คือ nosniff
X-Content-Type-Options: nosniffต้องส่ง Content-Type ให้ตรงของจริงด้วย เช่น text/html; charset=UTF-8, application/javascript, application/json ถ้าประกาศผิด เบราว์เซอร์จะไม่ยอมตีความเป็นชนิดอื่นเมื่อมี nosniff
ตัวอย่างการตั้งค่า
Header always set X-Content-Type-Options "nosniff"add_header X-Content-Type-Options "nosniff" always;สำหรับไฟล์ที่ผู้ใช้อัปโหลด ควรเสิร์ฟจากโดเมนหรือพาธที่ไม่มีสิทธิ์ทำเป็น HTML/สคริปต์ และใช้ Content-Disposition เมื่อเหมาะสม ตามแนว OWASP File Upload
สรุป
nosniff เป็น header ต้นทุนต่ำที่ควรมีทุกคำตอบ ใช้คู่กับ Content-Type ที่ถูกต้อง ไม่ใช่แทนการตรวจไฟล์อัปโหลด