CSP英文全稱Content Security Policy,中文意思是 內容安全策略。CSP以白名單的機制對網站加載或執行的資源起做用,在網頁中,這樣的策略經過 HTTP 頭信息或者 meta 元素定義。用於檢測並削弱某些特定類型的攻擊,包括跨站腳本 (XSS) 和數據注入攻擊等。不管是數據盜取、網站內容污染仍是散發惡意軟件。html
2種方式前端
在 HTML 的 Head 中添加 Meta 標籤web
<meta http-equiv="Content-Security-Policy" content="script-src 'nonce-shendun' zeptojs.com; object-src 'none';">
複製代碼
(提示:這裏推薦本地啓動web服務,去訪問這個頁面),這裏是最基本的配置,完整代碼以下:canvas
<!DOCTYPE html>
<html>
<head>
<script>
console.log('發生劫持,初始化就直接置頂的流氓行爲,CSP也沒法防護,但能夠經過埋點記錄LOG,通知工信部處理!!');
</script>
<meta charset="utf-8" />
<meta http-equiv="Content-Security-Policy" content="script-src 'nonce-shendun' zeptojs.com; object-src 'none';">
<title>CSP測試</title>
<script>
console.log('來劫持你了.... 但被阻止了,未能發生有效劫持!');
</script
<!-- 安全標籤 -->
<script nonce=shendun>
console.log('設置了nonce,其值與受信任來源列表中的值相匹配 ,此處有效!!');
</script>
</head>
<body>
<div>CSP測試</div>
<!-- zeptojs.com 加入了白名單 -->
<script src="http://zeptojs.com/zepto.min.js"></script>
<!-- 未加入白名單,被攔截 -->
<script src="https://mt.cnzz.com/js/hdpi_canvas.js"></script>
</body>
</html>
複製代碼
這種方式除了 頭部的注入型劫持未被攔截之外 ,其餘 script 劫持均被攔截。須要特別注意的是這段代碼中的 nonce-shendun ,這裏能夠理解爲 script 的安全屬性,nonce- 是CSP提供的參數,shendun 這個名字是自定義的(官方推薦這裏填隨機數)。後端
以 Nginx 爲例,配置 Sever 文件,添加以下代碼:安全
server {
...
add_header Content-Security-Policy "default-src *; script-src 'self' 'nonce-shendun' baidu.com *.baidu.com;";
...
複製代碼
源列表中也接受了四個關鍵字:bash
CSP的API和用法指南太多了,奉上傳送門:developer.mozilla.org/zh-CN/docs/… post
無論是前端配置仍是後端配置 CSP 都很是方便,可是也存在 Head 頭部協議被篡改,致使 CSP 失效的現象,這個時候 「薅羊毛」 的就有可乘之機。測試
如下是一個線上活動(加了CSP)的真實數據:網站
日期 | PV | UV | 劫持PV | 劫持UV | 劫持率(劫持uv/uv) |
---|---|---|---|---|---|
10/16 | 485034 | 106487 | 91376 | 41069 | 38.56% |
10/15 | 542713 | 123202 | 104994 | 48308 | 39.2% |
這些真實數據做者未作任何處理,不過這裏劫持UV數據拉的不是很科學,沒有過濾掉一個頁面出現屢次劫持的成分,但整體劫持率仍是很高。
開始懷疑人生...
CSP不是萬能的,有興趣的同窗能夠看下防運營商劫持一:
可二者結合使用,但願對你有所幫助~