原文地址:https://www.cnblogs.com/jying/p/13555016.html
最近小伙伴说系统有一个跳转第三方的功能有的人电脑端不好使了,我检查了下自己的页面,发现没问题,于是一口答复:不管!!!(其实是卑微的说:那先在手机端试试吧。结果手机端正常,于是就先忙别的事情了)
今天不经意间点了下自己手机端的功能,发现手机端也不显示了!!!然后再看电脑端也不好使了!!!吃了一惊之后赶紧开始偷偷解决bug,可不能让领导知道我写了bug!!!
但是最近这个功能没改过啊,之前一直好好的,怎么突然就不行了呢?
这个功能是打开第三方的页面,利用约定好的密钥token等加载登录者信息,为了让用户感觉不到是外部链接,特地嵌入进iframe加载显示,如果直接浏览器地址访问链接是成功的,换firefox浏览器原页面也是没问题的,所以首当其冲想到的就是chrome不支持iframe了吗???
网上查了下资料,果然有重大发现!!!
谷歌宣布将从7月14日发布的Chrome 84稳定版开始,重新恢复SameSite cookie策略,并且会逐步部署到Chrome 80以及以上的版本中。Chrome 80于今年2月份上线,谷歌就开始滚动推出SameSite更新,通过cookies的发送机制进行了一系列新的调整更好的维护用户隐私和安全。今年4月份鉴于全球疫情的爆发,谷歌宣布暂时中止该更新,以便在疫情大流行期间保持重要网站的正常运行。
也就是说chrome从7月14号开始推行这个设置,但是因为所有用户不是同时更新或安装,所以先更新的人就先表现出问题来了。
从Chrome 51开始,浏览器的Cookie新增加了一个SameSite属性,用来防止CSRF攻击和用户追踪。该设置当前默认是关闭的,但在Chrome 80之后,该功能默认已开启。
CSRF攻击和用户追踪是怎么回事?看看大神阮一峰的说明:http://www.ruanyifeng.com/blog/2019/09/cookie-samesite.html
解决方案总结:(开发者使用方案3)
方案1、手动修改浏览器的设置,这是对普通用户而言的,对开发者来说肯定不合适。
方案2、重新安装低版本浏览器,傻瓜方案。。。
方案3、开发后端设定 Set-Cookie 为 SameSite=None; Secure(且可能要求必须为https方式)。
前面说了因为该系统是嵌入的第三方的内容,短时间内要求对方添加该cookie设定来不及,而且对方为了防止CSRF也不一定会同意,所以只能暂时去掉iframe直接暴露第三方站点了。。希望有好的解决方案的童鞋评论区留下解决方案~~
以下两项为查找资料过程中的相关知识,虽然使用场景不多,先记录下来。
chrome 浏览器默认禁止iframe 嵌套页面下载文件:https://www.jianshu.com/p/789fd9fcd89d
出于沙盒安全性考虑,83版本的chrome浏览器默认禁止了iframe嵌套页面通过a标签的window.open,localtion.href点击下载,
为了解决这个问题,可以在父页面的iframe中sandbox="allow-downloads"进行解决,请不要使用allow-downloads-without-user-activation ( 允许在没有征求用户同意的情况下下载文件)<iframe sandbox="allow-downloads"></iframe>
chrome 现已支持延迟加载网页中的 iframe:https://news.cnblogs.com/n/668031,通过添加 loading="lazy"属性。
<iframe src="https://example.com" loading="lazy" width="600" height="400"></iframe>