(四)內容安全策略CSP—Content-Security-Policy
內容安全策略(CSP),其核心思想十分簡單:網站通過發送一個 CSP 頭部,來告訴瀏覽器什么是被授權執行的與什么是需要被禁止的。其被譽為專門為解決XSS攻擊而生的神器。
1.前言
內容安全策略 (CSP) 是一個額外的安全層,用於檢測並削弱某些特定類型的攻擊,包括跨站腳本 (XSS) 和數據注入攻擊等。無論是數據盜取、網站內容污染還是散發惡意軟件,這些攻擊都是主要的手段。
CSP 的實質就是白名單制度,開發者明確告訴客戶端,哪些外部資源可以加載和執行,等同於提供白名單。它的實現和執行全部由瀏覽器完成,開發者只需提供配置。
CSP 大大增強了網頁的安全性。攻擊者即使發現了漏洞,也沒法注入腳本,除非還控制了一台列入了白名單的可信主機。
2.CSP作用
限制資源獲取
報告資源獲取越權
3.限制方式
default-src限制全局
制定限制類型
資源類型有:connect-src、mainfest-src、img-src、font-src、media-src、style-src、frame-src、script-src…
4.應對威脅
4.1 跨站腳本攻擊
CSP 的主要目標是減少和報告 XSS 攻擊 ,XSS 攻擊利用了瀏覽器對於從服務器所獲取的內容的信任。惡意腳本在受害者的瀏覽器中得以運行,因為瀏覽器信任其內容來源,即使有的時候這些腳本並非來自於它本該來的地方。
CSP通過指定有效域——即瀏覽器認可的可執行腳本的有效來源——使服務器管理者有能力減少或消除XSS攻擊所依賴的載體。一個CSP兼容的瀏覽器將會僅執行從白名單域獲取到的腳本文件,忽略所有的其他腳本 (包括內聯腳本和HTML的事件處理屬性)。
作為一種終極防護形式,始終不允許執行腳本的站點可以選擇全面禁止腳本執行。
4.2 數據包嗅探攻擊
除限制可以加載內容的域,服務器還可指明哪種協議允許使用;比如 (從理想化的安全角度來說),服務器可指定所有內容必須通過HTTPS加載。一個完整的數據安全傳輸策略不僅強制使用HTTPS進行數據傳輸,也為所有的cookie標記安全標識 cookies with the secure flag,並且提供自動的重定向使得HTTP頁面導向HTTPS版本。網站也可以使用 Strict-Transport-Security HTTP頭部確保連接它的瀏覽器只使用加密通道。
5.CSP使用
CSP分類:
(1)Content-Security-Policy
配置好並啟用后,不符合 CSP 的外部資源就會被阻止加載。
(2)Content-Security-Policy-Report-Only
表示不執行限制選項,只是記錄違反限制的行為。它必須與report-uri選項配合使用。
CSP的使用:
(1)在HTTP Header上使用(首選)
"Content-Security-Policy:" 策略
"Content-Security-Policy-Report-Only:" 策略
1
2
(2)在HTML上使用
<meta http-equiv="content-security-policy" content="策略">
<meta http-equiv="content-security-policy-report-only" content="策略">
1
2
Meta 標簽與 HTTP 頭只是行式不同而作用是一致的,如果 HTTP 頭與 Meta 定義同時存在,則優先采用 HTTP 中的定義。
如果用戶瀏覽器已經為當前文檔執行了一個 CSP 的策略,則會跳過 Meta 的定義。如果 META 標簽缺少 content 屬性也同樣會跳過。
CSP使用實例:
1.一個網站管理者想要所有內容均來自站點的同一個源 (不包括其子域名)
Content-Security-Policy: default-src 'self'
1
2.一個網站管理者允許內容來自信任的域名及其子域名 (域名不必須與CSP設置所在的域名相同)
Content-Security-Policy: default-src 'self' *.trusted.com
1
3.一個網站管理者允許網頁應用的用戶在他們自己的內容中包含來自任何源的圖片, 但是限制音頻或視頻需從信任的資源提供者(獲得),所有腳本必須從特定主機服務器獲取可信的代碼.
Content-Security-Policy: default-src 'self'; img-src *; media-src media1.com media2.com; script-src userscripts.example.com
1
在這里,各種內容默認僅允許從文檔所在的源獲取, 但存在如下例外:
圖片可以從任何地方加載(注意 “*” 通配符)。
多媒體文件僅允許從 media1.com 和 media2.com 加載(不允許從這些站點的子域名)。
可運行腳本僅允許來自於userscripts.example.com。
4.一個線上銀行網站的管理者想要確保網站的所有內容都要通過SSL方式獲取,以避免攻擊者竊聽用戶發出的請求。
Content-Security-Policy: default-src https://onlinebanking.jumbobank.com
1
該服務器僅允許通過HTTPS方式並僅從onlinebanking.jumbobank.com域名來訪問文檔。
5.一個在線郵箱的管理者想要允許在郵件里包含HTML,同樣圖片允許從任何地方加載,但不允許JavaScript或者其他潛在的危險內容(從任意位置加載)。
Content-Security-Policy: default-src 'self' *.mailsite.com; img-src *
1
注意這個示例並未指定script-src。在此CSP示例中,站點通過 default-src 指令的對其進行配置,這也同樣意味着腳本文件僅允許從原始服務器獲取。
6.CSP的報告(report-only)模式
為降低部署成本,CSP可以部署為報告(report-only)模式。在此模式下,CSP策略不是強制性的,但是任何違規行為將會報告給一個指定的URI地址。此外,一個報告模式的頭部可以用來測試一個修訂后的未來將應用的策略而不用實際部署它。
你可以用Content-Security-Policy-Report-Only HTTP 頭部來指定你的策略,像這樣:
Content-Security-Policy-Report-Only: policy
1
如果Content-Security-Policy-Report-Only 頭部和 Content-Security-Policy 同時出現在一個響應中,兩個策略均有效。在Content-Security-Policy 頭部中指定的策略有強制性 ,而Content-Security-Policy-Report-Only中的策略僅產生報告而不具有強制性。
支持CSP的瀏覽器將始終對於每個企圖違反你所建立的策略都發送違規報告,如果策略里包含一個有效的report-uri 指令。
默認情況下,違規報告並不會發送。為啟用發送違規報告,你需要指定 report-uri 策略指令,並提供至少一個URI地址去遞交報告:
Content-Security-Policy: default-src 'self'; report-uri http://reportcollector.example.com/collector.cgi
1
然后你需要設置你的服務器能夠接收報告,使其能夠以你認為恰當的方式存儲並處理這些報告。