WEB應用內容安全策略(Content Security Policy)

CSP

內容安全策略(Content Security Policy)是什麼?

  內容安全策略(Content Security Policy)簡稱CSP是由W3C小組定義的一項規範,其主要做用是提供一個額外的安全層,用於檢測並削弱某些特定類型的攻擊,包括跨站腳本 (XSS) 和數據注入攻擊等.javascript

  目前內容安全策略(Content Security Policy)的規範一共有三個版本:css

  1. Content Security Policy Level 1
  2. Content Security Policy Level 2
  3. Content Security Policy Level 3

  如今主要使用的是第二個版本,第三個版本目前還在草案當中html

CSP的做用

  CSP被設計出來的目的就是爲了效防範內容注入攻擊,如XSS攻擊等.前端

  它經過讓開發者對本身WEB應用聲明一個外部資源加載的白名單,使得客戶端在運行WEB應用時對外部資源的加載作出篩選和識別,只加載被容許的網站資源.對於不被容許的網站資源不予加載和執行.同時,還能夠將WEB應用中出現的不被容許的資源連接和詳情報告給咱們指定的網址.如此,大大加強了WEB應用的安全性.使得攻擊者即便發現了漏洞,也無法注入腳本,除非還控制了一臺列入了白名單的服務器.java

使用CSP

CSP的選擇

  根據W3C的設計,CSP分爲兩種模式:json

  • 一種是Content-Security-Policy.

使用這種模式,將會直接阻止非法的外部資源加載,同時也能夠選擇是否配置將非法資源加載的連接和行爲報告給咱們指定的網址後端

  • 另外一種是Content-Security-Policy-Report-Only

使用這種模式時,客戶端在遇到非法的外部資源加載時並不會阻止,而是正常加載.可是會將次加載行爲和連接報告給我我指定的網址.因此使用此模式時,必需要使用report-uri策略配置報告非法資源加載狀況的網址.瀏覽器

  以上是CSP策略的兩種模式,在實際使用中,咱們能夠根據本身的狀況任意選擇其中一種模式.安全

CSP的使用方式

  CSP的使用方式有兩種:服務器

  • 一種是前端開發時直接在HTML頁面中使用<meta>標籤,以下:
<meta http-equiv="Content-Security-Policy" content="default-src 'self';">

<!-- or -->

<meta http-equiv="content-security-policy-report-only" content="default-src 'self';">
複製代碼
  • 一種是後端開發或服務運維人員對頁面的HTTP請求的響應配置Content-Security-Policy屬性,如在NGINX服務器上配置以下
add_header  Content-Security-Policy  "default-src 'self'";

# or

add_header  Content-Security-Policy-Report-Only  "default-src 'self'";
複製代碼

  經過以上兩種方式的任意一種便可啓用CSP.

CSP的配置

  一個策略由一系列策略指令所組成,每一個策略指令都描述了一個針對某個特定類型資源以及生效範圍的策略。你的策略應當包含一個default-src策略指令,在其餘資源類型沒有符合本身的策略時應用該策略(有關完整列表查看default-src)。一個策略能夠包含default-src或者script-src指令來防止內聯腳本運行, 並杜絕eval()的使用。 一個策略也可包含一個default-srcstyle-src指令去限制來自一個<style>元素或者style屬性的內聯樣式。

  示例: 常見用例,來自MDN:

  1. 一個網站管理者想要全部內容均來自站點的同一個源 (不包括其子域名)
Content-Security-Policy: default-src 'self'
複製代碼
  1. 一個網站管理者容許內容來自信任的域名及其子域名 (域名沒必要須與CSP設置所在的域名相同)
Content-Security-Policy: default-src 'self' *.trusted.com
複製代碼
  1. 一個網站管理者容許網頁應用的用戶在他們本身的內容中包含來自任何源的圖片, 可是限制音頻或視頻需從信任的資源提供者(得到),全部腳本必須從特定主機服務器獲取可信的代碼.
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。
  1. 一個線上銀行網站的管理者想要確保網站的全部內容都要經過SSL方式獲取,以免攻擊者竊聽用戶發出的請求。
Content-Security-Policy: default-src https://onlinebanking.jumbobank.com
複製代碼

  該服務器僅容許經過HTTPS方式並僅從onlinebanking.jumbobank.com域名來訪問文檔。

  1. 一個在線郵箱的管理者想要容許在郵件裏包含HTML,一樣圖片容許從任何地方加載,但不容許JavaScript或者其餘潛在的危險內容(從任意位置加載)。
Content-Security-Policy: default-src 'self' *.mailsite.com; img-src *
複製代碼

  注意這個示例並未指定script-src。在此CSP示例中,站點經過default-src指令的對其進行配置,這也一樣意味着腳本文件僅容許從原始服務器獲取

  1. 違例報告樣本

  默認狀況下,違規報告並不會發送。爲啓用發送違規報告,你須要指定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 頭部中指明的原始策略。

CSP的策略指令

  • 常見策略類型
策略指令 策略說明
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()等經過字符串建立代碼的方法。兩側單引號是必須的。

瀏覽器兼容性

Content Security Policy Level 1

CSP1

Content Security Policy Level 2

CSP2

上面是個人一些粗淺的總結,但願對你們有所幫助.若是文中有何不當之處請予以斧正,謝謝.

參考資料:

個人我的網址: wangyiming.info

相關文章
相關標籤/搜索