内容安全策略通过 HTTP 响应标头传递,与HSTS非常相似,并定义了浏览器只加载的已批准内容源。SCP可以有效防止跨站点脚本 (XSS) 攻击,并且得到广泛支持并且通常易于部署。
为什么我们需要 CSP?
浏览器加载此页面时,它会同时加载许多其他资源(比如 Google Analytics、社交分享按钮等)。通常一个网站页面有许多样式表和字体要加载,浏览器默认会加载页面引用的所有资源,一般浏览器会按照页面的源代码加载所有内容。它无法判断是否应该加载这些文件中的那些资源。如果攻击者在评论提交了了一个特制的评论,以从第三方域加载一些恶意 javascript,并且这也将由您的浏览器加载,因为它与页面一起包含。浏览器没有理由不信任来自外部链接的资源
并且无法知道内容是恶意的,这就是 CSP 的用武之地。
将批准的来源列入白名单
CSP 标头允许您定义浏览器可以加载的网站内容的批准来源。通过仅指定您希望浏览器从中加载内容的那些来源,您可以保护您的访问者免受各种问题的影响。这是一个基本的 CSP 响应标头。
CSP 常用指令
指令名 | demo | 说明 |
default-src | ‘self’ cdn.example.com | 默认策略,可以应用于所有请求 |
script-src | ‘self’ js.example.com | 定义js文件的过滤策略 |
style-src | ‘self’ css.example.com | 定义css文件的过滤策略 |
img-src | ‘self’ img.example.com | 定义图片文件的过滤策略 |
connect-src | ‘self’ | 定义请求连接文件的过滤策略 |
font-src | font.example.com | 定义字体文件的过滤策略 |
object-src | ‘self’ | 定义页面的过滤策略,如 <object>,<applet>等元素 |
media-src | media.example.com | 定义媒体的过滤策略,如 <audio>, <video>等元素 |
frame-src | ‘self’ | 定义加载子frmae的策略 |
sandbox | allow-forms allow-scripts | 沙盒模式,会阻止页面弹窗/js执行等, |
report-uri | /some-report-uri |
CSP 常用指令值
所有以-src结尾的指令都可以用一下的值来定义过滤规则,多个规则之间可以用空格来隔开
值 | demo | 说明 |
* | img-src * | 允许任意地址的url,不包括 blob: filesystem: schemes. |
‘none’ | object-src ‘none’ | 所有地址的咨询都不允许加载 |
‘self’ | script-src ‘self’ | 同源策略,即允许同域名同端口下,同协议下的请求 |
data: | img-src ‘self’ data: | 允许通过data来请求咨询 比如用Base64、SVG |
domain.example.com | img-src domain.example.com | 允许特性的域名请求资源 |
*.example.com | img-src *.example.com | 允许从 example.com下的任意子域名加载资源 |
https://cdn.com | img-src https://cdn.com | 仅允许通过https协议来从指定域名下加载资源 |
https: | img-src https: | 只允许通过https协议加载资源 |
‘unsafe-inline’ | script-src ‘unsafe-inline’ | 允许行内代码执行 |
‘unsafe-eval’ | script-src ‘unsafe-eval’ | 允许不安全的动态代码执行,JavaScript的 eval()方法 |
示例
default-src 'self';
只允许同源下的资源
script-src 'self';
只允许同源下的js
script-src 'self' www.google-analytics.com ajax.googleapis.com;
允许同源以及两个地址下的js加载
default-src 'none'; script-src 'self'; connect-src 'self'; img-src 'self'; style-src 'self';
多个资源时,后面的会覆盖前面的
修改 nginx 网站配置文件:
在需要配置内容安全策略的站点 conf 文件下增加以下类似代码,前面是 add_header Content-Security-Policy 后面就可以定义你自己的规则。每个人的站点资源不一样的,以下内容仅供参考:
add_header Content-Security-Policy
"default-src 'self' wangshuashua.com;
script-src 'self' hm.baidu.com www.googletagmanager.com;
img-src 'self' https://cdn.wangshuashua.com https ://img.ikewen.com data:https://cravatar.cn;
style-src 'self' 'unsafe-inline' fonts.googleapis.com;
font-src 'self' fonts.gstatic.com; 'unsafe-inline''unsafe-eval' blob:date:;";
浏览器支持
幸运的是,对 CSP 标头的支持很普遍,基本上除了 Internet Explorer 其他浏览器都已支持。如果非要使用 Internet Explorer 的话,需要配置X-Content-Security-Policy
标头,如果您想获得对 CSP 标头的最广泛支持,需要同时配置 add_header Content-Security-Policy
和 add_header X-Content-Security-Policy
!反正我不是已经抛弃 IE 了。
如果你对网站安全性要求很高,可以到 securityheaders 这里检测一下,并根据提示加强配置。
2 条评论 “Nginx 配置内容安全策略CSP(Content-Security-Policy)”
最后的header站点检测不太准的样子,一些header检测不出来
感觉这个设置很麻烦。