CSP(Content-Security-Policy)內容安全策略,官方解釋:CSP是一個額外的徹底層,用於檢測並小若某些特定類型的攻擊,包括跨站腳本攻擊XSS和數據注入攻擊等。javascript
配置方法:css
1. 後端配置網絡服務器返回Content-Security-Policy頭部html
2. 前端經過<meta>標籤進行配置前端
<meta http-equiv="Content-Security-Policy" content="default-src 'self';">複製代碼
CSP使用目的java
XSS攻擊方面:CSP的主要用途是減小和上報XSS攻擊,經過指定 瀏覽器承認的可執行腳本的有效來源(將僅執行從白名單域獲取到的腳本文件,忽略全部其餘腳本,包括內聯腳本和HTML的事件處理屬性),使服務器管理者有能力減小或者消除XSS攻擊所依賴的載體。後端
數據注入攻擊方面:可指定全部內容必須經過HTTPS加載。瀏覽器
策略制定安全
配置相關策略,能夠控制瀏覽器爲該頁面獲取的資源。bash
Content-Security-Policy: default-src | script-src | style-src | img-src ....服務器
script-src
:外部腳本style-src
:樣式表img-src
:圖像media-src
:媒體文件(音頻和視頻)font-src
:字體文件object-src
:插件(好比 Flash)child-src
:框架frame-ancestors
:嵌入的外部資源(好比<frame>、<iframe>、<embed>和<applet>)connect-src
:HTTP 鏈接(經過 XHR、WebSockets、EventSource等)worker-src
:worker
腳本manifest-src
:manifest 文件經常使用安全策略方案:
1. 內容同源
Content-Security-Policy: default-src 'self'複製代碼
2. 信任指定域資源
Content-Security-Policy: default-src 'self' *.example.com複製代碼
3. 信任全部圖片源,限制富媒體資源
Content-Security-Policy: default-src 'selc'; img-src *; media-src media1.com media2.com; srcipt-src *.example.com複製代碼
默認的,各種資源容許從文檔所在源獲取,但如下內容除外:
4. 經過HTTPS加載
Content-Security-Policy: default-src https://some.trusted.com/複製代碼
測試策略
Content-Security-Policy-Report-Only(報告模式),CSP策略不是強制性的,但任何違規行爲都會上報到指定URI。
Content-Security-Policy和Content-Security-Policy-Report-Only,也能夠同時使用,Content-Security-Policy帶有策略強制性,而Content-Security-Policy-Report-Only中的策略只產生報告不具備強制性。
發送違規報告
啓用發送違規報告,須要指定report-uri策略指令,並提供至少一個URI地址:
Content-Security-Policy: default-src 'self'; report-uri https://report.catch.com/collector.cpi複製代碼
而後在服務器設置接收。
案例使用說明
假設一個 https://example.com/index.html 頁面,CSP策略禁止任何資源的加載,除了cdn.example.com的資源樣式表。
Content-Security-Policy: default-src 'none'; style-src cdn.example.com; report-uri /_/report-collect複製代碼
index.html代碼以下:
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="css/style.css">
</head>
<body>...</body>
</html>複製代碼
因爲CSP的設置,頁面總link標籤的css資源沒法被正常加載,且還會發送一個違規報告到https://example.com/_/report-collect:
{
"report-collect": {
"document-uri": https://example.com/index.html, // 發生違規行爲的文檔的URI
"referrer": "", // 違規發生處的文檔引用地址
"blocked-uri": "https://example.com/css/style.css", // 被CSP阻止的資源
"violated-directive": "style-src cdn.example.com", // 違反的策略名稱
"original-policy": "default-src 'none'; style-src cdn.example.com;report-uri /_/report-collect", // 原始策略
}
}複製代碼