內(nèi)容安全策略(CSP)詳解

1.背景

1.1.同源策略

網(wǎng)站的安全模式源于“同源策略”,web瀏覽器允許第一個web頁面中的腳本訪問頁面中的數(shù)據(jù),但前提是兩個web頁面具有相同的源。此策略防止一個頁面的惡意腳本通過該頁面的文檔訪問另一個網(wǎng)頁上的敏感數(shù)據(jù)。
規(guī)則:協(xié)議、主機、和端口號

安全風(fēng)險例子:
1,假設(shè)你正在訪問銀行網(wǎng)站但未注銷
2,這時候你跳轉(zhuǎn)到另外一個站點
3,該站點注入一些惡意代碼(比如:進行交易操作等)

1.2.網(wǎng)頁安全漏洞----跨網(wǎng)站腳本XSS

在某些情況下,同源策略的限制性如果太強,其實是不太友好的,比如說大型網(wǎng)站的子域之間的數(shù)據(jù)傳遞,開發(fā)過程中的一些調(diào)試等;但是人類是比較聰明的,利用一些技術(shù)、從而放寬策略
但是,跨網(wǎng)站腳本 (XSS)攻擊可通過欺騙網(wǎng)站提供惡意代碼和計劃好的內(nèi)容來繞過同源政策:通過尋找將惡意腳本注入網(wǎng)頁,攻擊者可以獲得對敏感頁面內(nèi)容,會話cookie以及瀏覽器代表用戶維護的各種其他信息的提升訪問權(quán)限。
1,盜號
2,強制發(fā)送郵件...

2.CSP內(nèi)容安全策略

為了緩解很大一部分潛在的跨腳本問題,瀏覽器的擴展程序系統(tǒng)引入了內(nèi)容安全策略(CSP)的一般概念;簡單來說這一技術(shù)就是:

開發(fā)者明確告訴客戶端(制定比較嚴格的策略和規(guī)則),哪些外部資源是可以加載和執(zhí)行的 ,即使攻擊者發(fā)現(xiàn)漏洞,但是它是沒辦法注入腳本的

開發(fā)人員可以使用這種工具以各種方式鎖定其應(yīng)用程序,降低內(nèi)容注入漏洞(如跨站點腳本)的風(fēng)險,并降低其應(yīng)用程序執(zhí)行的權(quán)限

3.怎么啟用CSP?

可以通過兩種方式:

1,一種是通過 HTTP 頭信息的Content-Security-Policy的字段


在這里插入圖片描述

2,通過網(wǎng)頁的<meta>標簽

<meta http-equiv="Content-Security-Policy" content="script-src 'self'">

我們在頁面引入一個cdn,但是meta的content只設(shè)置為script-src 'self'

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <meta http-equiv="Content-Security-Policy"  content="script-src 'self'"/>
    <title>Document</title>
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
</head>

那么,我們將會看到如下結(jié)果


在這里插入圖片描述

4 常見配置

該策略允許加載同源的圖片、腳本、AJAX和CSS資源,并阻止加載其他任何資源,對于大多數(shù)網(wǎng)站是一個不錯的配置。

default-src ‘none’; script-src ‘self’; connect-src ‘self’; img-src ‘self’; style-src ‘self’;


CSP的意義

防XSS等攻擊的利器。CSP 的實質(zhì)就是白名單制度,開發(fā)者明確告訴客戶端,哪些外部資源可以加載和執(zhí)行,等同于提供白名單。它的實現(xiàn)和執(zhí)行全部由瀏覽器完成,開發(fā)者只需提供配置。CSP 大大增強了網(wǎng)頁的安全性。攻擊者即使發(fā)現(xiàn)了漏洞,也沒法注入腳本,除非還控制了一臺列入了白名單的可信主機。

CSP的分類

(1)Content-Security-Policy
配置好并啟用后,不符合 CSP 的外部資源就會被阻止加載。
(2)Content-Security-Policy-Report-Only
表示不執(zhí)行限制選項,只是記錄違反限制的行為。它必須與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 定義同時存在,則優(yōu)先采用 HTTP 中的定義。
如果用戶瀏覽器已經(jīng)為當(dāng)前文檔執(zhí)行了一個 CSP 的策略,則會跳過 Meta 的定義。如果 META 標簽缺少 content 屬性也同樣會跳過。

策略應(yīng)該怎么寫

(1)舉個例子

// 限制所有的外部資源,都只能從當(dāng)前域名加載
Content-Security-Policy: default-src 'self'

// default-src 是 CSP 指令,多個指令之間用英文分號分割;多個指令值用英文空格分割
Content-Security-Policy: default-src https://host1.com https://host2.com; frame-src 'none'; object-src 'none'  

// 錯誤寫法,第二個指令將會被忽略
Content-Security-Policy: script-src https://host1.com; script-src https://host2.com

// 正確寫法如下
Content-Security-Policy: script-src https://host1.com https://host2.com

// 通過report-uri指令指示瀏覽器發(fā)送JSON格式的攔截報告到某個地址
Content-Security-Policy: default-src 'self'; ...; report-uri /my_amazing_csp_report_parser; 

// 報告看起來會像下面這樣

{  
  "csp-report": {  
    "document-uri": "http://example.org/page.html",  
    "referrer": "http://evil.example.com/",  
    "blocked-uri": "http://evil.example.com/evil.js",  
    "violated-directive": "script-src 'self' https://apis.google.com",  
    "original-policy": "script-src 'self' https://apis.google.com; report-uri http://example.org/my_amazing_csp_report_parser"  
  }  
} 

(2)常用的CSP指令


在這里插入圖片描述

(3)其他的CSP指令


在這里插入圖片描述

(4)CSP指令值
在這里插入圖片描述

支持問題

(1)CSP1兼容性
瀏覽器可以很好地支持 CSP 1,全球高達94.66%,中國達到79.55%(截至2018年4月12日)。


在這里插入圖片描述

(2)CSP2兼容性
CSP 2還很新,支持相對少點,全球達81.11%,中國達到60.04%(截至2018年4月12日)。


在這里插入圖片描述
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容