內容安全策略(Content Security Policy)簡稱CSP
是由W3C小組定義的一項規範,其主要做用是提供一個額外的安全層,用於檢測並削弱某些特定類型的攻擊,包括跨站腳本 (XSS) 和數據注入攻擊等.javascript
目前內容安全策略(Content Security Policy)的規範一共有三個版本:css
如今主要使用的是第二個版本,第三個版本目前還在草案當中html
CSP
被設計出來的目的就是爲了效防範內容注入攻擊,如XSS攻擊等.前端
它經過讓開發者對本身WEB應用聲明一個外部資源加載的白名單,使得客戶端在運行WEB應用時對外部資源的加載作出篩選和識別,只加載被容許的網站資源.對於不被容許的網站資源不予加載和執行.同時,還能夠將WEB應用中出現的不被容許的資源連接和詳情報告給咱們指定的網址.如此,大大加強了WEB應用的安全性.使得攻擊者即便發現了漏洞,也無法注入腳本,除非還控制了一臺列入了白名單的服務器.java
根據W3C的設計,CSP
分爲兩種模式:json
Content-Security-Policy
.使用這種模式,將會直接阻止非法的外部資源加載,同時也能夠選擇是否配置將非法資源加載的連接和行爲報告給咱們指定的網址後端
Content-Security-Policy-Report-Only
使用這種模式時,客戶端在遇到非法的外部資源加載時並不會阻止,而是正常加載.可是會將次加載行爲和連接報告給我我指定的網址.因此使用此模式時,必需要使用report-uri
策略配置報告非法資源加載狀況的網址.瀏覽器
以上是CSP
策略的兩種模式,在實際使用中,咱們能夠根據本身的狀況任意選擇其中一種模式.安全
CSP
的使用方式有兩種:服務器
<meta>
標籤,以下:<meta http-equiv="Content-Security-Policy" content="default-src 'self';">
<!-- or -->
<meta http-equiv="content-security-policy-report-only" content="default-src 'self';">
複製代碼
Content-Security-Policy
屬性,如在NGINX服務器上配置以下add_header Content-Security-Policy "default-src 'self'";
# or
add_header Content-Security-Policy-Report-Only "default-src 'self'";
複製代碼
經過以上兩種方式的任意一種便可啓用CSP
.
一個策略由一系列策略指令所組成,每一個策略指令都描述了一個針對某個特定類型資源以及生效範圍的策略。你的策略應當包含一個
default-src
策略指令,在其餘資源類型沒有符合本身的策略時應用該策略(有關完整列表查看default-src)。一個策略能夠包含default-src
或者script-src
指令來防止內聯腳本運行, 並杜絕eval()
的使用。 一個策略也可包含一個default-src
或style-src
指令去限制來自一個<style>
元素或者style屬性的內聯樣式。
示例: 常見用例,來自MDN:
Content-Security-Policy: default-src 'self'
複製代碼
Content-Security-Policy: default-src 'self' *.trusted.com
複製代碼
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。
Content-Security-Policy: default-src https://onlinebanking.jumbobank.com
複製代碼
該服務器僅容許經過HTTPS方式並僅從onlinebanking.jumbobank.com域名來訪問文檔。
Content-Security-Policy: default-src 'self' *.mailsite.com; img-src *
複製代碼
注意這個示例並未指定script-src
。在此CSP示例中,站點經過default-src
指令的對其進行配置,這也一樣意味着腳本文件僅容許從原始服務器獲取
默認狀況下,違規報告並不會發送。爲啓用發送違規報告,你須要指定report-uri
策略指令,並提供至少一個URI地址去遞交報告。這個地址能夠是相對於當前網站的相對地址,也能夠是一個絕對地址:
Content-Security-Policy: default-src 'none'; style-src cdn.example.com; report-uri /_/csp-reports
複製代碼
報告格式以下:
{
"csp-report": {
"document-uri": "http://example.com/signup.html",
"referrer": "",
"blocked-uri": "http://example.com/css/style.css",
"violated-directive": "style-src cdn.example.com",
"original-policy": "default-src 'none'; style-src cdn.example.com; report-uri /_/csp-reports"
}
}
複製代碼
違例報告的語法:
做爲報告的JSON對象報告包含了如下數據:
document-uri
: 發生違規的文檔的URI。referrer
: 違規發生處的文檔引用(地址)。blocked-uri
: 被CSP阻止的資源URI。若是被阻止的URI來自不一樣的源而非文檔URI,那麼被阻止的資源URI會被刪減,僅保留協議,主機和端口號。violated-directive
: 違反的策略名稱。original-policy
: 在 Content-Security-Policy HTTP 頭部中指明的原始策略。
策略指令 | 策略說明 |
---|---|
default-src | 默認加載策略 |
script-src | 外部腳本 |
style-src | 樣式表 |
img-src | 圖像 |
media-src | 媒體文件(音頻和視頻) |
font-src | 字體文件 |
object-src | 插件(好比 Flash) |
child-src | 框架 |
frame-ancestors | 嵌入的外部資源(好比<iframe> 、<iframe> 、<embed> 和<applet> ) |
connect-src | HTTP 鏈接(經過 XHR、WebSockets、EventSource等) |
worker-src | worker腳本 |
manifest-src | manifest 文件 |
想要了解策略的所有類型能夠查看這裏
指令值 | 指令值說明 |
---|---|
* | 容許任何內容 |
‘none’ | 不容許任何內容 |
‘self’ | 容許來自相同來源的內容(相同的協議、域名和端口) |
data: | 容許 data: 協議(如 base64 編碼的圖片) |
www.Google.com | 容許加載指定域名的資源 |
*.Google.com | 容許加載 Google.com 任何子域的資源 |
‘unsafe-inline’ | 容許使用內聯資源,如內聯的 <script> 元素、javascript: URL、內聯的事件處理函數和內聯的 <style> 元素.兩側單引號是必須的. |
‘unsafe-eval’ | 容許使用eval() 等經過字符串建立代碼的方法。兩側單引號是必須的。 |
上面是個人一些粗淺的總結,但願對你們有所幫助.若是文中有何不當之處請予以斧正,謝謝.
參考資料:
個人我的網址: wangyiming.info