一、nosniff是什么
nosniff是一種HTTP響應(yīng)頭(HTTP response header),用于防止瀏覽器執(zhí)行MIME類型錯(cuò)誤的響應(yīng)體(response body)。
所謂MIME類型錯(cuò)誤,指的是在http響應(yīng)頭中指定的Content-Type與實(shí)際響應(yīng)體返回的MIME類型不一致,這種情況下瀏覽器可能會(huì)忽略響應(yīng)頭中指定的Content-Type,執(zhí)行實(shí)際響應(yīng)體的MIME類型,造成安全風(fēng)險(xiǎn)。
nosniff頭部的值為“X-Content-Type-Options: nosniff”,意為告訴瀏覽器禁止執(zhí)行與Content-Type指定的類型不一致的響應(yīng)內(nèi)容。
// 示例代碼
HTTP/1.1 200 OK
Content-Type: application/javascript;charset=utf-8
X-Content-Type-Options: nosniff
二、nosniff的作用機(jī)制
當(dāng)服務(wù)器使用X-Content-Type-Options: nosniff響應(yīng)頭返回響應(yīng)時(shí),瀏覽器會(huì)強(qiáng)制執(zhí)行Content-Type指定的類型,以保證用戶安全。nosniff告訴瀏覽器,不要執(zhí)行HTML內(nèi)容的js腳本,不要執(zhí)行JSON內(nèi)容的html代碼,不要執(zhí)行plain/text類型的任何內(nèi)容等等。
nosniff的作用是簡單而直接的,它并不檢測或修改響應(yīng)的實(shí)際內(nèi)容。相反,它只是告訴瀏覽器在讀取響應(yīng)之前忽略該響應(yīng)的Content-Type,而只遵循響應(yīng)頭中的Content-Type。
另外,nosniff還可以防止圖片注入攻擊(pinhole attack),在HTML文檔中,通過將數(shù)據(jù)URL Uri作為圖片的src屬性值發(fā)送到瀏覽器上來,使得待執(zhí)行腳本可以完全掌控該圖片的內(nèi)容。如果響應(yīng)頭未包含nosniff標(biāo)頭,則瀏覽器可能會(huì)將圖片識(shí)別為JavaScript文件,并在執(zhí)行時(shí)將其解釋為代碼,從而導(dǎo)致XSS攻擊。
三、nosniff的應(yīng)用場景
nosniff主要應(yīng)用于防范跨站腳本攻擊(XSS)和“snippet-injection”攻擊。Snippet-injection攻擊是指把HTML代碼嵌套到非HTML內(nèi)容,瀏覽器會(huì)讀取并解析該內(nèi)容。這可能導(dǎo)致XSS攻擊或把被詐騙者誤導(dǎo)到包含惡意代碼的站點(diǎn)。
nosniff一般都是跟X-XSS-Protection和Content-Security-Policy等安全頭一起使用,從而使得Web應(yīng)用更加安全。例如,Content-Security-Policy中添加了default-src 'none' 選項(xiàng),當(dāng)瀏覽器加載到一個(gè)非白名單內(nèi)的內(nèi)容時(shí),該內(nèi)容會(huì)被禁止執(zhí)行,進(jìn)而提高了應(yīng)用安全性。
四、如何使用nosniff
在使用nosniff時(shí),開發(fā)人員應(yīng)該將其添加到服務(wù)器響應(yīng)頭中,示例代碼如下:
X-Content-Type-Options: nosniff
nosniff是一個(gè)比較簡單的安全頭,大多數(shù)情況下,開發(fā)者并不需要過多考慮其的影響。一般而言,為了使得Web應(yīng)用更加安全,nosniff可以隨同其他安全頭一起添加,從而最大限度地降低XSS的風(fēng)險(xiǎn)。
五、綜合實(shí)例
下面是一段使用了nosniff的HTTP響應(yīng)頭的代碼:
HTTP/1.1 200 OK
Content-Type: text/html;charset=utf-8
X-Content-Type-Options: nosniff
nosniff Demo
在這個(gè)例子中,我們通過在響應(yīng)頭中添加X-Content-Type-Options: nosniff頭部,在瀏覽器讀取HTML文件之前,強(qiáng)制指定Content-Type類型為text/html。這將阻止瀏覽器執(zhí)行諸如JavaScript,CSS和其他非Text/HTML MIME類型的文件內(nèi)容,有效地減少了跨站腳本攻擊風(fēng)險(xiǎn)。