在本文中,將介紹常用的安全頭信息設(shè)置,并對每個響應(yīng)頭設(shè)置給出一個示例。
Content-Security-Policy
內(nèi)容安全策略(CSP)常用來通過指定允許加載哪些資源來防止跨站點(diǎn)腳本攻擊。在接下來所介紹的所有安全頭信息中,CSP 可能是創(chuàng)建和維護(hù)花費(fèi)時間最多的而且也是最容易出問題的。在配置你的網(wǎng)站 CSP 過程中,要小心徹底地測試它,因為阻止某些資源有可能會破壞你的網(wǎng)站的功能。
功能
CSP 的主要目標(biāo)是減少和報告 XSS 攻擊, XSS 攻擊利用了瀏覽器對于從服務(wù)器所獲取的內(nèi)容的信任。使得惡意腳本有可能在用戶的瀏覽器中執(zhí)行,因為瀏覽器信任其內(nèi)容來源,即使有時候這些腳本并非來自該站點(diǎn)的服務(wù)器當(dāng)中。
CSP 通過指定允許瀏覽器加載和執(zhí)行那些資源,使服務(wù)器管理者有能力減少或消除 XSS 攻擊的可能性。一個 CSP 兼容的瀏覽器將會僅執(zhí)行從白名單域獲取得到的腳本文件,忽略所有其他的腳本(包括內(nèi)聯(lián)腳本)。
示例
一個最佳的 CSP 可能是下面這樣(注釋按照配置值的順序),在站點(diǎn)包含的每一部分資源請求相關(guān)都加入域名限制。
- 所有的內(nèi)容(比如: JAVAScript,image,css,fonts,ajax request, frams, html5 Media等)均來自和站點(diǎn)的同一個源(不包括其子域名)
- 允許加載當(dāng)前源的圖片和特定源圖片
- 不允許 objects(比如 Flash 和 Java)
- 僅允許當(dāng)前源的腳本下載和執(zhí)行
- 僅允許當(dāng)前源的 CSS 文件下載和執(zhí)行
- 僅允許當(dāng)前源的 frames
- 限制 <base> 標(biāo)簽中的 URL 與當(dāng)前站點(diǎn)同源
- 僅允許表單提交到當(dāng)前站點(diǎn)
Content-Security-Policy: default-src \'self\'; img-src \'self\' https://img.com; object-src \'none\'; script-src \'self\'; style-src \'self\'; frame-ancestors \'self\'; base-uri \'self\'; form-action \'self\';
關(guān)于 CSP 更加詳細(xì)的介紹可以看 https://content-security-policy.com/
Strict-Transport-Security
Strict-Transport-Security(HSTS) 告訴瀏覽器該站點(diǎn)只能通過 HTTPS 訪問,如果使用了子域,也建議對任何該站點(diǎn)的子域強(qiáng)制執(zhí)行此操作。
功能
一個站點(diǎn)如果接受了一個 HTTP 請求,然后跳轉(zhuǎn)到 HTTPS,用戶可能在開始跳轉(zhuǎn)前,通過沒有加密的方式和服務(wù)器對話。這樣就存在中間人攻擊的潛在威脅,跳轉(zhuǎn)過程可能被惡意網(wǎng)站利用來直接接觸用戶信息,而不是原來的加密信息。
網(wǎng)站通過HTTP Strict Transport Security通知瀏覽器,這個網(wǎng)站禁止使用HTTP方式加載,瀏覽器應(yīng)該自動把所有嘗試使用HTTP的請求自動替換為HTTPS請求。
示例
- 瀏覽器接受到這個請求后的 3600 秒內(nèi)的時間,凡是訪問這個域名下的請求都是用https請求
- 指定 includeSubDomains 此規(guī)則適用該站點(diǎn)下的所有子域名
Strict-Transport-Security: max-age=3600; includeSubDomains
X-Content-Type-Options
X-Content-Type-Options 響應(yīng)頭相當(dāng)于一個提示標(biāo)志,被服務(wù)器用戶提示瀏覽器一定要遵循 Content-Type 頭中 MIME 類型的設(shè)定,而不能對其進(jìn)行修改。
功能
它減少了瀏覽器可能“猜測”某些內(nèi)容不正確的意外應(yīng)用程序行為,例如當(dāng)開發(fā)人員將一個頁面標(biāo)記為“HTML”,但瀏覽器認(rèn)為它看起來像JavaScript并試圖將其呈現(xiàn)為JavaScript時。這個頭將確保瀏覽器始終按照服務(wù)器設(shè)置的MIME類型來解析。
示例
X-Content-Type-Options: nosniff
Cache-Control
Cache-Control 通用消息頭字段,被用于在 http 請求和響應(yīng)中,通過指定指令來實(shí)現(xiàn)緩存機(jī)制。緩存指令是單向的,這意味著在請求中設(shè)置的指令,不一定被包含在響應(yīng)中。
功能
這一個比其他的稍微復(fù)雜一些,因為你可能需要針對不同的內(nèi)容類型使用不同的緩存策略。
任何包含有敏感信息的網(wǎng)頁,例如用戶個人信息頁面或客戶結(jié)帳頁面,都應(yīng)該設(shè)置為 no-cache。原因是防止共享計算機(jī)上的某人按下后退按鈕或瀏覽歷史并查看個人信息。
示例
Cache-Control: no-cache
X-Frame-Options
X-Frame-Options 響應(yīng)頭是用來給瀏覽器指示允許一個頁面可否在 <frame>, <iframe>, <embed> 或者 <object> 中展現(xiàn)的標(biāo)記。站點(diǎn)可以通過確保網(wǎng)站沒有被嵌入到別人的站點(diǎn)里面,從而避免點(diǎn)擊劫持攻擊。
功能
如果惡意的站點(diǎn)將你的網(wǎng)頁嵌入到 iframe 標(biāo)簽中, 在你不知道的情況下打開并點(diǎn)擊惡意網(wǎng)站的某個按鈕,惡意網(wǎng)站能夠執(zhí)行一個攻擊通過運(yùn)行一些 JavaScript 將捕獲點(diǎn)擊事件到 iframe 中,然后代表你與網(wǎng)站交互。
將 X-Frame-Options 設(shè)置為 deny 可以禁止該頁面在任何域中的 ifram 標(biāo)簽中展示。
X-Frame-Options 設(shè)置可以由 CSP 的 frame-ancestors 配置所代替。
示例
X-Frame-Options: DENY # 表示該頁面不允許在 frame 中展示,即便是在相同域名的頁面中嵌套也不允許。 X-Frame-Options: SAMEORIGIN # 表示該頁面可以在相同域名頁面的 frame 中展示。 X-Frame-Options: ALLOW-FROM uri # 表示該頁面可以在指定來源的 frame 中展示。
Access-Control-Allow-Origin
Access-Control-Allow-Origin 響應(yīng)頭指定了該響應(yīng)的資源是否被允許與給定的 origin 共享。
功能
可以被用來可解決瀏覽器的跨域請求。
比如一個站點(diǎn) A 頁面中發(fā)起一個 AJAX 請求到 站點(diǎn) B, A B 不同源。正常情況下因為瀏覽器的同源策略將不會把 B 的響應(yīng)結(jié)果返回給 A, 除非 B 在響應(yīng)頭中設(shè)置允許 A 站點(diǎn)發(fā)起請求。
示例
Access-Control-Allow-Origin: * # 允許所有域請求 Access-Control-Allow-Origin: http://someone.com # 允許特定域請求
Set-Cookie
Set-Cookie 響應(yīng)頭被用來由服務(wù)器端向客戶端發(fā)送 cookie。
示例
- domain: 指定 cookie 可以送達(dá)的域名,默認(rèn)為當(dāng)前域名(不包含子域名)
- Secure: 只有在 https 協(xié)議時才會被發(fā)送到服務(wù)端。然而,保密或敏感信息永遠(yuǎn)不要在 HTTP cookie 中存儲或傳輸,因為整個機(jī)制從本質(zhì)上來說都是不安全的
- HttpOnly: cookie 不能使用 JavaScript代碼獲取到
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly
X-XSS-Protection
X-XSS-Protection 響應(yīng)頭是Internet Explorer,Chrome和Safari的一個功能,當(dāng)檢測到跨站腳本攻擊 (XSS)時,瀏覽器將停止加載頁面。
示例
X-XSS-Protection: 1; mode=block # 啟用XSS過濾。如果檢測到 XSS 攻擊,瀏覽器將不會清除頁面,而是阻止頁面加載。
總結(jié)
設(shè)置 HTTP 頭信息是相對快速和簡單的對于網(wǎng)站的數(shù)據(jù)保護(hù)、XSS 攻擊和點(diǎn)擊劫持等攻擊。有針對性的設(shè)置這些頭信息,你的網(wǎng)站的安全性將會有不錯的提高。