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