安全 HTTP 回應標頭
預設安全標頭
Spring Security 提供一組預設的安全相關 HTTP 回應標頭,以提供安全預設值。
Spring Security 的預設值是包含以下標頭
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Content-Type-Options: nosniff
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
X-XSS-Protection: 0
Strict-Transport-Security 僅在 HTTPS 請求上添加 |
如果預設值不符合您的需求,您可以輕鬆地從這些預設值中移除、修改或新增標頭。有關每個標頭的更多詳細資訊,請參閱相應章節
快取控制
Spring Security 的預設值是停用快取,以保護使用者的內容。
如果使用者通過驗證以檢視敏感資訊,然後登出,我們不希望惡意使用者能夠點擊「上一頁」按鈕來檢視敏感資訊。預設發送的快取控制標頭如下
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
為了預設安全,Spring Security 預設會新增這些標頭。但是,如果您的應用程式提供自己的快取控制標頭,Spring Security 會退出。這允許應用程式確保可以快取靜態資源 (例如 CSS 和 JavaScript)。
內容類型選項
從歷史上看,瀏覽器 (包括 Internet Explorer) 會嘗試使用內容嗅探來猜測請求的內容類型。這允許瀏覽器通過猜測未指定內容類型的資源的內容類型來改善使用者體驗。例如,如果瀏覽器遇到未指定內容類型的 JavaScript 檔案,它將能夠猜測內容類型,然後執行它。
當允許上傳內容時,應該做很多額外的事情 (例如,僅在不同的網域中顯示文檔、確保設定 Content-Type 標頭、清理文檔等)。但是,這些措施超出了 Spring Security 提供的範圍。同樣重要的是要指出,在停用內容嗅探時,您必須指定內容類型才能使內容正常工作。 |
內容嗅探的問題在於,這允許惡意使用者使用多語言檔案 (即,一個檔案對多種內容類型都有效) 來執行 XSS 攻擊。例如,某些網站可能允許使用者將有效的 postscript 文檔提交到網站並檢視它。惡意使用者可能會建立一個postscript 文檔,它也是一個有效的 JavaScript 檔案,並使用它執行 XSS 攻擊。
預設情況下,Spring Security 通過將以下標頭新增到 HTTP 回應來停用內容嗅探
X-Content-Type-Options: nosniff
HTTP Strict Transport Security (HSTS)
當您輸入銀行的網站時,您輸入 mybank.example.com
還是 https://mybank.example.com
?如果您省略 https
協定,您可能會受到中間人攻擊的威脅。即使網站執行重新導向到 https://mybank.example.com
,惡意使用者也可能會攔截初始 HTTP 請求並操縱回應 (例如,重新導向到 https://mibank.example.com
並竊取其憑證)。
許多使用者省略了 https
協定,這就是為什麼建立HTTP Strict Transport Security (HSTS) 的原因。一旦 mybank.example.com
作為 HSTS 主機新增,瀏覽器就可以預先知道對 mybank.example.com 的任何請求都應解釋為 https://mybank.example.com
。這大大降低了發生中間人攻擊的可能性。
根據 RFC6797,HSTS 標頭僅注入到 HTTPS 回應中。為了使瀏覽器確認標頭,瀏覽器必須首先信任簽署用於建立連線的 SSL 憑證的 CA (而不僅僅是 SSL 憑證)。 |
將網站標記為 HSTS 主機的一種方法是將主機預先載入到瀏覽器中。另一種方法是將 Strict-Transport-Security
標頭新增到回應中。例如,Spring Security 的預設行為是新增以下標頭,該標頭指示瀏覽器將網域視為 HSTS 主機一年 (非閏年有 31536000 秒)
Strict-Transport-Security: max-age=31536000 ; includeSubDomains ; preload
可選的 includeSubDomains
指令指示瀏覽器也應將子網域 (例如 secure.mybank.example.com
) 視為 HSTS 網域。
可選的 preload
指令指示瀏覽器應將網域預先載入到瀏覽器中作為 HSTS 網域。有關 HSTS 預先載入的更多詳細資訊,請參閱 hstspreload.org。
HTTP Public Key Pinning (HPKP)
為了保持被動,Spring Security 仍然在servlet 環境中提供對 HPKP 的支援。但是,由於前面列出的原因,Spring Security 團隊不再建議使用 HPKP。 |
HTTP Public Key Pinning (HPKP) 向網路用戶端指定要與特定網路伺服器一起使用的公鑰,以防止使用偽造憑證的中間人 (MITM) 攻擊。如果使用正確,HPKP 可以增加額外的保護層,以防止憑證洩露。但是,由於 HPKP 的複雜性,許多專家不再建議使用它,並且 Chrome 甚至移除了對它的支援。
有關為什麼不再建議使用 HPKP 的更多詳細資訊,請閱讀 HTTP Public Key Pinning 已死嗎? 和 我放棄 HPKP 了。
X-Frame-Options
讓您的網站被添加到框架中可能是一個安全問題。例如,通過使用巧妙的 CSS 樣式,使用者可能會被欺騙點擊他們不打算點擊的東西。例如,已登入銀行的使用者可能會點擊一個按鈕,該按鈕授予其他使用者存取權限。這種攻擊稱為 點擊劫持。
處理點擊劫持的另一種現代方法是使用 Content Security Policy (CSP)。 |
有很多方法可以緩解點擊劫持攻擊。例如,為了保護舊版瀏覽器免受點擊劫持攻擊,您可以使用 框架破解程式碼。雖然不完美,但框架破解程式碼是您可以為舊版瀏覽器做的最好的事情。
解決點擊劫持的一種更現代的方法是使用 X-Frame-Options 標頭。預設情況下,Spring Security 通過使用以下標頭來停用在 iframe 中呈現頁面
X-Frame-Options: DENY
X-XSS-Protection
某些瀏覽器內建支援過濾掉反射型 XSS 攻擊。該過濾器已在主要瀏覽器中棄用,並且 目前的 OWASP 建議是顯式將標頭設定為 0。
預設情況下,Spring Security 使用以下標頭阻止內容
X-XSS-Protection: 0
Content Security Policy (CSP)
Content Security Policy (CSP) 是一種機制,網路應用程式可以使用它來緩解內容注入漏洞,例如跨網站腳本 (XSS)。CSP 是一種宣告式策略,它為網路應用程式作者提供了一種宣告並最終告知用戶端 (使用者代理) 網路應用程式期望從中載入資源的來源的工具。
Content Security Policy 無意解決所有內容注入漏洞。相反,您可以使用 CSP 來幫助減少內容注入攻擊造成的危害。作為第一道防線,網路應用程式作者應驗證其輸入並編碼其輸出。 |
網路應用程式可以通過在回應中包含以下 HTTP 標頭之一來使用 CSP
-
Content-Security-Policy
-
Content-Security-Policy-Report-Only
每個標頭都用作向用戶端傳遞安全策略的機制。安全策略包含一組安全策略指令,每個指令負責宣告特定資源表示的限制。
例如,網路應用程式可以通過在回應中包含以下標頭來宣告它期望從特定的受信任來源載入腳本
Content-Security-Policy: script-src https://trustedscripts.example.com
嘗試從 script-src
指令中宣告的來源以外的其他來源載入腳本會被使用者代理阻止。此外,如果在安全策略中宣告了 report-uri 指令,則違規將由使用者代理報告給宣告的 URL。
例如,如果網路應用程式違反了宣告的安全策略,則以下回應標頭指示使用者代理將違規報告發送到策略的 report-uri
指令中指定的 URL。
Content-Security-Policy: script-src https://trustedscripts.example.com; report-uri /csp-report-endpoint/
違規報告是標準 JSON 結構,可以由網路應用程式自己的 API 或公共託管的 CSP 違規報告服務 (例如 report-uri.io/) 捕獲。
Content-Security-Policy-Report-Only
標頭為網路應用程式作者和管理員提供了監視安全策略而不是強制執行它們的功能。此標頭通常在實驗或開發網站的安全策略時使用。當策略被認為有效時,可以使用 Content-Security-Policy
標頭欄位強制執行它。
給定以下回應標頭,該策略宣告可以從兩個可能的來源之一載入腳本。
Content-Security-Policy-Report-Only: script-src 'self' https://trustedscripts.example.com; report-uri /csp-report-endpoint/
如果網站違反此策略 (通過嘗試從 evil.example.com
載入腳本),則使用者代理會將違規報告發送到 report-uri
指令宣告的 URL,但仍然允許違規資源載入。
將 Content Security Policy 應用於網路應用程式通常是一項非平凡的任務。以下資源可能為您的網站開發有效的安全策略提供進一步的幫助
Referrer Policy
Referrer Policy 是一種機制,網路應用程式可以使用它來管理 referrer 欄位,該欄位包含使用者上次所在的頁面。
Spring Security 的方法是使用 Referrer Policy 標頭,該標頭提供不同的策略
Referrer-Policy: same-origin
Referrer-Policy 回應標頭指示瀏覽器讓目的地知道使用者之前所在的來源。
Feature Policy
Feature Policy 是一種機制,它允許網路開發人員選擇性地啟用、停用和修改瀏覽器中某些 API 和網路功能的行為。
Feature-Policy: geolocation 'self'
借助 Feature Policy,開發人員可以選擇加入一組「策略」,供瀏覽器在整個網站中使用的特定功能上強制執行。這些策略限制了網站可以存取的 API 或修改瀏覽器某些功能的預設行為。
Permissions Policy
Permissions Policy 是一種機制,它允許網路開發人員選擇性地啟用、停用和修改瀏覽器中某些 API 和網路功能的行為。
Permissions-Policy: geolocation=(self)
借助 Permissions Policy,開發人員可以選擇加入一組「策略」,供瀏覽器在整個網站中使用的特定功能上強制執行。這些策略限制了網站可以存取的 API 或修改瀏覽器某些功能的預設行為。
自訂標頭
有關如何組態基於 servlet 的應用程式的資訊,請參閱相關章節。 |
Spring Security 具有使其可以方便地將更常見的安全標頭添加到您的應用程式的機制。但是,它也提供了掛鉤以啟用新增自訂標頭。