nginx_csp - meetbill/butterfly-nginx GitHub Wiki

csp

1 CSP是什么

CSP指的是内容安全策略(Content-Security-Policy),是一个HTTP Header 头名称,是W3C一个成熟标准。CSP 的实质就是白名单制度,开发者可以在CSP中声明允许浏览器加载的资源列表,不在列表中的资源浏览器将不会加载。它的实现和执行全部由浏览器完成,保证我们的网站时只加载指定的资源。

这是一种防御XSS攻击的纵深防御技术,目前谷歌地图、facebook、推特等都有csp header

(1) 确定要使用的指令名
一般推荐业务线使用object-src、script-src、report-uri,这几个就足够可以阻止绝大多数来自上游脏数据注入的第三方javascript,其他指令名对解决XSS盲打帮助不大。
该头需要在返回HTML文档接口的HTTP Response Header处声明。meta中设置的CSP不支持 report-uri指令,故不可在meta中设置。
(2) 声明 object-src
object-src  'none'  防止浏览器加载执行嵌入的插件资源<object>,<embed>或<applet>标签。以防止 Flash xss

(3) 声明 script-src
script-src  用于控制浏览器加载页面js的范围。其对应指令值含义如下

'self' 该标志位指允许当前域的js脚本加载
'unsafe-inline'  该标志位允许内联脚本加载, 开发者实现免不了在页面里会有内联的<script>标签,不过因外界攻击者难以猜测内网平台的CSP策略来进行对抗升级,故允许业务线声明该标志位来避免误拦。
'unsafe-eval'    该标志位允许页面加载eval()、new Founction()、定时器等JavaScript函数。允许业务线声明该标志位来避免误拦业务线的内联脚本。
'report-sample'   该标志位被声明后,外界尝试XSS攻击时或有脚本触发了违例,浏览器会异步将违例的前40个字节POST给 report-uri 对应的链接,可以用于定位XSS漏洞
(4) 声明 report-uri 进行违例上报
浏览器会异步将违例信息POST一个json给report-uri。违例信息会包含CSP拦截的脚本加载位置、触发XSS的URL 。 

2 验证

安装插件 https://chrome.google.com/webstore/detail/caspr-enforcer/fekcdjkhlbjngkimekikebfegbijjafd?hl=zh-CN

添加 CSP,开启后查看页面是否有混乱现象

3 开启

nginx

server {
...
add_header Content-Security-Policy "object-src 'none'; script-src 'self' 'unsafe-inline' 'unsafe-eval' 'report-sample' *.xxx.com:* blob:; report-uri https://report-uri.baidu.com/report?app=yiqiu;";
...
}

xxx.com 是当前网站的域名

传送门

http://www.ruanyifeng.com/blog/2016/09/csp.html

⚠️ **GitHub.com Fallback** ⚠️