Web安全之充分利用 X-Content-Type-Options
X-Content-Type-Options 是什么?
X-Content-Type-Options 是一種 HTTP 響應頭,用于控制瀏覽器是否應該嘗試 MIME 類型嗅探。如果啟用了 X-Content-Type-Options,瀏覽器將遵循服務器提供的 MIME 類型,用于防止瀏覽器執行 MIME 類型錯誤的響應體(response body)。
如果在http響應頭中指定的 Content-Type 與實際響應體返回的 MIME 類型不一致,這種情況下瀏覽器可能會忽略響應頭中指定的Content-Type,執行實際響應體的 MIME 類型,造成安全風險,而設置 X-Content-Type-Options 就是為了避免這種類型的安全風險。
如何設置 X-Content-Type-Options ?
在服務器端(前后端分離的場景下,只需要在前端站點所在服務器配置即可,如果前后端在一起的話在項目所在服務器配置)的代碼或反向代理服務配置中添加 X-Content-Type-Options 頭即可。
以 nginx為例,在 nginx.conf 文件中添加以下行:
add_header X-Content-Type-Options nosniff;
以 apache為例,在 .htaccess 文件中添加以下行:
Header set X-Content-Type-Options "nosniff"
響應頭 key 是 X-Content-Type-Options,值為 nosniff。這個配置是告訴瀏覽器禁止執行與 Content-Type 指定的類型不一致的響應內容,不要嘗試從文件擴展名或文件內容中推斷出文件類型,從而避免了內容嗅探所帶來的安全風險。
X-Content-Type-Options 應用場景
主要用于防范 XSS(跨站腳本攻擊)和 snippet-injection 攻擊。snippet-injection 攻擊是指把 HTML 代碼嵌入到非 HTML 內容,瀏覽器會讀取并解析該內容。這可能導致XSS攻擊或著被誤導到包含惡意代碼的站點。
看個例子
下面是一段使用了 X-Content-Type-Options 響應頭的代碼:
HTTP/1.1 200 OK
Content-Type: text/html;charset=utf-8
X-Content-Type-Options: nosniff
<html>
<head>
<title>路多辛的博客</title>
</head>
<body>
<script>
alert("nosniff warning");
</script>
</body>
</html>
通過在響應頭中添加 X-Content-Type-Options: nosniff,告訴瀏覽器只能執行 MIME 為 text/html 的響應內容,將阻止瀏覽器執行 JavaScript 代碼。