nginx csp 白名单问题记录

起因

本地开发完项目了,测试也测完了。部署到线上,突然测试和我说,网关里做了一个配置,说罢,截图发给我看

nginx csp 白名单问题记录

然后说,现在地图显示不出来了,让我看看是不是哪里有问题,要调整下

问题排查

我先登上去,看到地图确实没有显示出来,打开F12
控制台 还报了一个错

(原图来不及保存,和下图差不多,不过我报的问题是 img-src 'self' data:, 别人报的是 default-src),

nginx csp 白名单问题记录

network那一项,一堆红色

nginx csp 白名单问题记录

分析

csp (Content Security Policy) 俗称白名单,你(客户端)想访问的资源,我(服务端)这里都设置了明确的来源,在我的允许范围内的来源,我会放行,否则,我不会放行。

一开始,我也没仔细看,因为之前老早之前有次和移动端联调,也是网关那里设置了安全操作,只能走 https, 我那次碰到的问题,就是地图服务就是走的http, 所以被拦了,所以,我直接把地图服务的的协议 改成了 https 打包,给测试,想着应该可以了, 没多久,测试和我说,还是看不了地图。

然后,我再仔细看了下报错,说是 问题出在 img-src, 我看他网关那里,白名单里有我的 地图服务的地址的啊,不应该啊

nginx csp 白名单问题记录

我不放心,让测试,把网关里的 csp 里的过滤条件发过来,我在 index.html里添加一遍试试

    <meta http-equiv="Content-Security-Policy"
      content="default-src *; frame-src 'self' data:; script-src 'self' 'unsafe-inline' 'unsafe-eval' *.amap.com; worker-src 'self' blob:; img-src 'self' *.amap.com *.autonavi.com data:; font-src 'self' data: *.alicdn.com; style-src 'self' 'unsafe-inline'; object-src 'none'">

再打个包,过去试试,结果,测试又说,还是不行,依旧有问题

问题开始有意思起来了

csp里面是有的 autonavi.com 的,但是实际就是地图出不来,

# 网关配置信息
http: 
    enabled: true #默认开启跨域的
    timestampKeys: #timestampKeys是一些安全性上认证的参数
         - rd
         - _rendertime
    responseHeaders: #responseHeaders里面的参数是一些响应头的安全设置
         X-Content-Type-Options: nosniff
         X-XSS-Protection: "1; mode=block"
         # Content-Security-Policy: "default-src *; script-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self' data:; font-src 'self' data:; style-src 'self' 'unsafe-inline'; object-src 'none'"
         Content-Security-Policy: "default-src *; frame-src 'self' data:; script-src 'self' 'unsafe-inline' 'unsafe-eval' *.amap.com; worker-src 'self' blob:; img-src 'self' *.amap.com *.autonavi.com data:; font-src 'self' data: *.alicdn.com; style-src 'self' 'unsafe-inline'; object-src 'none'"

我这次对着接口的响应数据来仔细看,发现了问题的源头,直接公布答案,就是响应头

我的推断,既然网关那里设置了白名单,进行过滤筛选,那么能正常响应的内容,比如接口,图片啥的,肯定是符合条件的,那么在响应请求的时候,服务器那里肯定会进行把关,而这个配置,又不是写在代码里的逻辑处理,是nginx配置出来的,那么,请求的时候,肯定会携带配置信息

nginx csp 白名单问题记录

果然,请求的响应头里面携带了 csp的信息,我一看,这不对啊,这个csp 和 测试给我的图片,明显是少了很多内容啊

nginx csp 白名单问题记录

我第一反应是测试改了网关的配置,没有重启下网关,让他重启下试试,然后他重启了,发现还是不行,我看了下network,发现报的问题依旧如此。

我就跑到测试位置上,和他说,可能是他改错了网关,他检查了一下,发现,果然是改错了网关位置,把网关调整好之后,重启网关,访问项目,地图正常展示出来了。

一点碎碎念:我司的网关不是 nginx, 是后端大佬自己弄得,在服务器上是一个 proxy的文件夹, 里面有一个叫 app.yml的文件,我知道 springboot 开发模式中有个就是用 yml文件配置的,但是我看他得配置方式,和 nginx 很像。

我想者两者应该都差不多,而且你后端开发完之后部署,配置。也是对配置文件进行调整和我调整nginx的配置文件几乎没啥区别,所以我对着当前这个问题查资料,查到基本都是讲nginx的配置,我如果,一直反复纠结,这是公司内部的网关,那我可能这个问题就没法处理

既然公司自己的网关配置 和 nginx 很像,那索性就当nginx 来处理,理论上是行的通的,事实证明,果然也是行得通的。

参考文章

1.一次性解决It violates the following Content Security Policy directive: ‘iframe-src’..

2.nginx解决内容安全策略CSP(Content-Security-Policy)配置方式

原文链接:https://juejin.cn/post/7352762230918610980 作者:海的对岸

(0)
上一篇 2024年4月1日 下午4:16
下一篇 2024年4月1日 下午4:27

相关推荐

发表回复

登录后才能评论