Web安全之充分利用 X-Content-Type-Options
X-Content-Type-Options 是什么?
X-Content-Type-Options 是一種 HTTP 響應(yīng)頭,用于控制瀏覽器是否應(yīng)該嘗試 MIME 類型嗅探。如果啟用了 X-Content-Type-Options,瀏覽器將遵循服務(wù)器提供的 MIME 類型,用于防止瀏覽器執(zhí)行 MIME 類型錯(cuò)誤的響應(yīng)體(response body)。
如果在http響應(yīng)頭中指定的 Content-Type 與實(shí)際響應(yīng)體返回的 MIME 類型不一致,這種情況下瀏覽器可能會(huì)忽略響應(yīng)頭中指定的Content-Type,執(zhí)行實(shí)際響應(yīng)體的 MIME 類型,造成安全風(fēng)險(xiǎn),而設(shè)置 X-Content-Type-Options 就是為了避免這種類型的安全風(fēng)險(xiǎn)。
如何設(shè)置 X-Content-Type-Options ?
在服務(wù)器端(前后端分離的場(chǎng)景下,只需要在前端站點(diǎn)所在服務(wù)器配置即可,如果前后端在一起的話在項(xiàng)目所在服務(wù)器配置)的代碼或反向代理服務(wù)配置中添加 X-Content-Type-Options 頭即可。
以 nginx為例,在 nginx.conf 文件中添加以下行:
add_header X-Content-Type-Options nosniff;
以 apache為例,在 .htaccess 文件中添加以下行:
Header set X-Content-Type-Options "nosniff"
響應(yīng)頭 key 是 X-Content-Type-Options,值為 nosniff。這個(gè)配置是告訴瀏覽器禁止執(zhí)行與 Content-Type 指定的類型不一致的響應(yīng)內(nèi)容,不要嘗試從文件擴(kuò)展名或文件內(nèi)容中推斷出文件類型,從而避免了內(nèi)容嗅探所帶來(lái)的安全風(fēng)險(xiǎn)。
X-Content-Type-Options 應(yīng)用場(chǎng)景
主要用于防范 XSS(跨站腳本攻擊)和 snippet-injection 攻擊。snippet-injection 攻擊是指把 HTML 代碼嵌入到非 HTML 內(nèi)容,瀏覽器會(huì)讀取并解析該內(nèi)容。這可能導(dǎo)致XSS攻擊或著被誤導(dǎo)到包含惡意代碼的站點(diǎn)。
看個(gè)例子
下面是一段使用了 X-Content-Type-Options 響應(yīng)頭的代碼:
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>
通過(guò)在響應(yīng)頭中添加 X-Content-Type-Options: nosniff,告訴瀏覽器只能執(zhí)行 MIME 為 text/html 的響應(yīng)內(nèi)容,將阻止瀏覽器執(zhí)行 JavaScript 代碼。