Nginx 配置内容安全策略CSP(Content-Security-Policy)

内容安全策略通过 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-srcfont.example.com定义字体文件的过滤策略
object-src‘self’定义页面的过滤策略,如 <object>,<applet>等元素
media-srcmedia.example.com定义媒体的过滤策略,如 <audio>, <video>等元素
frame-src‘self’定义加载子frmae的策略
sandboxallow-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.comimg-src domain.example.com允许特性的域名请求资源
*.example.comimg-src *.example.com允许从 example.com下的任意子域名加载资源
https://cdn.comimg-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-Policyadd_header X-Content-Security-Policy!反正我不是已经抛弃 IE 了。

如果你对网站安全性要求很高,可以到 securityheaders 这里检测一下,并根据提示加强配置。

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

2 条评论 “Nginx 配置内容安全策略CSP(Content-Security-Policy)”