nginx_csp - meetbill/butterfly-nginx GitHub Wiki
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 。
安装插件 https://chrome.google.com/webstore/detail/caspr-enforcer/fekcdjkhlbjngkimekikebfegbijjafd?hl=zh-CN
添加 CSP,开启后查看页面是否有混乱现象
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 是当前网站的域名