CSP 的概念
Content-Security-Policy 內容安全策略
讓網站變得更加安全
詳細資料
mdn csp
作用
限制資源獲取
報告資源獲取越權
限制方式
default-src限制全域性
制定資源型別
資源型別
connect-src
img-src
font-src
media-src
frame-src
script-src
manifest-src
style-src
一些案例
限制內聯指令碼
在 web 領域,xss 可以通過注入指令碼的方式進行攻擊
const http = require('http')
const fs = require('fs')
http.createServer(function (request, response) {
console.log('request come', request.url)
if (request.url === '/') {
const html = fs.readFileSync('test.html', 'utf8')
response.writeHead(200, {
'Content-Type': 'text/html',
'Content-Security-Policy': 'default-src http: https:' // 只能通過http或https的方式載入
})
response.end(html)
} else {
response.writeHead(200, {
'Content-Type': 'application/javascript'
})
response.end('console.log("loaded script")')
}
}).listen(8888)
console.log('server listening on 8888')
複製程式碼
<body>
<div>This is content</div>
<!-- 內聯指令碼 -->
<script>
console.log('inline js')
</script>
</body>
</html>
複製程式碼
控制檯報錯
Refused to execute inline script because it violates the following Content Security Policy directive: "default-src http: https:". Either the 'unsafe-inline' keyword, a hash ('sha256-KU4m2rqHAFwi569te1RE5P3qW1O/qJ+m+gVo66Frm4k='), or a nonce ('nonce-...') is required to enable inline execution. Note also that 'script-src' was not explicitly set, so 'default-src' is used as a fallback.
限制外鏈載入 script
限制外連結在 的 script 通過哪些域名進行載入
如,限制只能通過本域名進行載入 外鏈 script
// server.js
'Content-Security-Policy': 'script-src \'self\'' // 限制外鏈 script 只能是本域名下的
複製程式碼
// test.html
<script src="test.js"></script> 本域名下的可以使用
<script src="https://cdn.bootcss.com/jquery/3.3.1/core.js"></script>
複製程式碼
8888埠訪問,可以看到報錯資訊
Refused to load the script 'https://cdn.bootcss.com/jquery/3.3.1/core.js' because it violates the following Content Security Policy directive: "script-src 'self'".
檢視 network,發現在瀏覽器端就被 block掉了,沒有傳送請求。
限制指定某個網站
'Content-Security-Policy': 'script-src \'self\' https://cdn.bootcss.com' // 限制外鏈 script 只能是本域名下的,允許指定域名script載入
複製程式碼
這樣就沒有報錯資訊了,network 看到 core.js載入成功
限制 form 表單提交範圍
form 不接受 default-src 的限制,可以通過 form-action來限制。
下例中 form 會調轉到 baidu.com,通過 form-action限制瀏覽器會報錯。
// server.js
'Content-Security-Policy': 'script-src \'self\'; form-action \'self\'' // 限制表單提交只能在本域下
複製程式碼
// test.html
<form action="http://baidu.com">
<button type="submit">click me</button>
</form>
複製程式碼
報錯資訊
Refused to send form data to 'http://baidu.com/' because it violates the following Content Security Policy directive: "form-action 'self'".
限制圖片連結
通過全侷限制 default-src 就可以實現
'Content-Security-Policy': 'default-src \'self\'; form-action \'self\''
複製程式碼
限制 ajax 請求
通過 connect-src
'Content-Security-Policy': 'connect-src \'self\'; form-action \'self\'; report-uri / report'
})
複製程式碼
<script>
fetch('http://baidu.com')
</script>
複製程式碼
報錯資訊
Refused to connect to 'http://baidu.com/' because it violates the following Content Security Policy directive: "connect-src 'self'".
彙報
// server.js
'Content-Security-Policy': 'default-src \'self\'; form-action \'self\'; report-uri / report'
複製程式碼
network檢視,傳送的內容,是 標準的 csp report 的內容。
允許載入但彙報
使用 'Content-Security-Policy-Report-Only'
// server.js
'Content-Security-Policy-Report-Only': 'default-src \'self\'; form-action \'self\'; report-uri / report'
複製程式碼
資源會正常載入,但是彙報 Report-Only相關的錯誤提醒
在 html 中使用 csp
和在服務端使用效果相同,最好在服務端做。
<meta http-equiv="Content-Security-Policy" content="script-src 'self'; form-action 'self';">
複製程式碼
report-uri 不允許在 html 的 meta 中使用,只能在服務端通過 head 進行設定。