什麼是CSP
CSP全稱Content Security Policy
,可以直接翻譯爲內容安全策略,說白了,就是爲了頁面內容安全而制定的一系列防護策略. 通過CSP
所約束的的規責指定可信的內容來源(這裏的內容可以指腳本、圖片、iframe、fton、style
等等可能的遠程的資源)。通過CSP協定,讓WEB處於一個安全的運行環境中。
有什麼用?
我們知道前端有個很著名的”同源策略”,簡而言之,就是說一個頁面的資源只能從與之同源的服務器獲取,而不允許跨域獲取.這樣可以避免頁面被注入惡意代碼,影響安全.但是這個策略是個雙刃劍,擋住惡意代碼的同時也限制了前端的靈活性,那有沒有一種方法既可以讓我們可以跨域獲取資源,又能防止惡意代碼呢?
答案是當然有了,這就是csp
,通過csp
我們可以制定一系列的策略,從而只允許我們頁面向我們允許的域名發起跨域請求,而不符合我們策略的惡意攻擊則被擋在門外.從而實現
需要說明的一點是,目前主流的瀏覽器都已支持csp
.所以我們可以放心大膽的用了.
指令說明
指令就是csp中用來定義策略的基本單位,我們可以使用單個或者多個指令來組合作用,功能防護我們的網站.
以下是常用的指令說明:
指令名 | demo | 說明 |
---|---|---|
default-src | ‘self’ cdn.example.com | 默認策略,可以應用於js文件/圖片/css/ajax請求等所有訪問 |
script-src | ‘self’ js.example.com | 定義js文件的過濾策略 |
style-src | ‘self’ css.example.com | 定義css文件的過濾策略 |
img-src | ‘self’ img.example.com | 定義圖片文件的過濾策略 |
connect-src | ‘self’ | 定義請求連接文件的過濾策略 |
font-src | font.example.com | 定義字體文件的過濾策略 |
object-src | ‘self’ | 定義頁面插件的過濾策略,如 <object>, <embed> 或者<applet> 等元素 |
media-src | media.example.com | 定義媒體的過濾策略,如 HTML6的 <audio>, <video> 等元素 |
frame-src | ‘self’ | 定義加載子frmae的策略 |
sandbox | allow-forms allow-scripts | 沙盒模式,會阻止頁面彈窗/js執行等,你可以通過添加allow-forms allow-same-origin allow-scripts allow-popups, allow-modals, allow-orientation-lock, allow-pointer-lock, allow-presentation, allow-popups-to-escape-sandbox, and allow-top-navigation 策略來放開相應的操作 |
report-uri | /some-report-uri |
指令值
所有以-src
結尾的指令都可以用一下的值來定義過濾規則,多個規則之間可以用空格來隔開
值 | demo | 說明 |
---|---|---|
* | img-src * | 允許任意地址的url,但是不包括 blob: filesystem: schemes. |
‘none’ | object-src ‘none’ | 所有地址的諮詢都不允許加載 |
‘self’ | script-src ‘self’ | 同源策略,即允許同域名同端口下,同協議下的請求 |
data: | img-src ‘self’ data: | 允許通過data來請求諮詢 (比如用Base64 編碼過的圖片). |
domain.example.com | img-src domain.example.com | 允許特性的域名請求資源 |
*.example.com | img-src *.example.com | 允許從 example.com下的任意子域名加載資源 |
https://cdn.com | img-src https://cdn.com | 僅僅允許通過https協議來從指定域名下加載資源 |
https: | img-src https: | 只允許通過https協議加載資源 |
‘unsafe-inline’ | script-src ‘unsafe-inline’ | 允許行內代碼執行 |
‘unsafe-eval’ | script-src ‘unsafe-eval’ | 允許不安全的動態代碼執行,比如 JavaScript的 eval()方法 |
例子:
<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline' my.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' my.com">
內容安全策略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:" 策略
(2)在HTML上使用
<meta http-equiv="content-security-policy" content="策略">
<meta http-equiv="content-security-policy-report-only" content="策略">
Meta 標籤與 HTTP 頭只是行式不同而作用是一致的,如果 HTTP 頭與 Meta 定義同時存在,則優先採用 HTTP 中的定義。
如果用戶瀏覽器已經爲當前文檔執行了一個 CSP
的策略,則會跳過 Meta
的定義。如果 META
標籤缺少 content
屬性也同樣會跳過。
CSP使用實例:
1.一個網站管理者想要所有內容均來自站點的同一個源 (不包括其子域名)
Content-Security-Policy: default-src 'self'
2.一個網站管理者允許內容來自信任的域名及其子域名 (域名不必須與CSP設置所在的域名相同)
Content-Security-Policy: default-src 'self' *.trusted.com
3.一個網站管理者允許網頁應用的用戶在他們自己的內容中包含來自任何源的圖片, 但是限制音頻或視頻需從信任的資源提供者(獲得),所有腳本必須從特定主機服務器獲取可信的代碼.
Content-Security-Policy: default-src 'self'; img-src *; media-src media1.com media2.com; script-src userscripts.example.com
在這裏,各種內容默認僅允許從文檔所在的源獲取, 但存在如下例外:
- 圖片可以從任何地方加載(注意 “*” 通配符)。
- 多媒體文件僅允許從
media1.com
和media2.com
加載(不允許從這些站點的子域名)。 - 可運行腳本僅允許來自於
userscripts.example.com
。
4.一個線上銀行網站的管理者想要確保網站的所有內容都要通過SSL方式獲取,以避免攻擊者竊聽用戶發出的請求。
Content-Security-Policy: default-src https://onlinebanking.jumbobank.com
該服務器僅允許通過HTTPS方式並僅從onlinebanking.jumbobank.com
域名來訪問文檔。
5.一個在線郵箱的管理者想要允許在郵件裏包含HTML,同樣圖片允許從任何地方加載,但不允許JavaScript或者其他潛在的危險內容(從任意位置加載)。
Content-Security-Policy: default-src 'self' *.mailsite.com; img-src *
注意這個示例並未指定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
如果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
然後你需要設置你的服務器能夠接收報告,使其能夠以你認爲恰當的方式存儲並處理這些報告。