1.1 内容安全策略 (CSP) 是一个策略,定义了哪些资源可以被加载,可以减少和报告XSS攻击。其实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,开发者只需提供配置(如1.2所述)。CSP 大大增强了网页的安全性,攻击者即使发现漏洞也无法注入脚本,除非他还控制了一台列入了白名单的可信主机。一般同源策略只对网页的HTML文档做了限制,对加载的其他静态资源如javascript、css、图片等资源等还是可以加载。
1.2 例子
我们对http://example.com/signup.html
使用以下策略,除了cdn.example.com的样式之外,不允许使用其他来源的样式。
Content-Security-Policy: default-src 'none'; style-src cdn.example.com; report-uri /_/csp-reports
http://example.com/signup.html
页面代码如下:
<!DOCTYPE html>
<html>
<head>
<title>Sign Up</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
... Content ...
</body>
</html>
样式表仅允许从cdn.example.com
加载,而网站尝试从其原点(http://example.com
)加载样式表 。能够执行CSP的浏览器将以下违规报告作为POST请求发送,记录在http://example.com/_/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"
}
}
1.3 配置CSP的两种方式
- HTTP Header(首选)
可以使用Content-Security-Policy HTTP响应头来进行配置
- meta标签(慎选)
如果要使用需要放到html的最前面
<meta http-equiv="Content-Security-Policy" content="default-src 'self' *.xx.com *.xx.cn 'unsafe-inline' 'unsafe-eval';">
注意Header 和Meta不要混用,因为CSP是以最严格的策略为准,混用时很容易出问题,导致配置不生效,详情参考文档 [The effect of multiple policies]
1.4 参考