一、同站策略问题

chrome自版本80之后,出现了所谓同站策略问题。

即,在A页面请求B页面,如果chrome发现它们不是同一个站点的话,就不传cookie给B页面所在的服务器。众所周知,原本cookie是会附在浏览器到服务器的每个请求(request)里的,仿佛这是理所应当,自然而然的,现在好了,chrome区分情况,不一定允许这么干了。

这样的后果是什么呢?就是有些功能以前没问题的,现在不行了。拿我们项目来说,原本我们有些WEB项目,会用iframe将其他项目的一些页面嵌进去,看上去就好像同一个系统一样,这叫界面集成吧,很正常的行为。两边项目的自动登录什么的都搞好了,一直运行正常。后来升级了浏览器,发现嵌进去的页面数据出不来。程序没有做任何更改,最后发现是账号登录问题,嵌进去的页面始终处于无法登录状态,从而导致获取不了数据。

具体来说,cookie是由服务器分配给浏览器的,相当于给了浏览器一个访问凭证。浏览器每次访问服务器的时候,都会带上这些个凭证。现在由于浏览器策略改变,嵌进去的页面与服务器交互的时候,无法带上cookie,服务器检索不到这个凭证,就每次都给页面分配一个新的cookie,前后对应不上,当然就登录不了了。

其实,chrome一直有这个同站策略,Chrome 51 开始,浏览器的 Cookie 新增加了一个SameSite属性,用来防止 CSRF 攻击和用户追踪。SameSite可以设置三个值:

Strict
Lax
None

Strict最为严格,完全禁止第三方 Cookie,跨站点时,任何情况下都不会发送 Cookie。

Lax规则稍稍放宽,分情况处理,具体如下

None的话,就不做是否同站的检查和限制。以前,chrome默认SameSite=None,80版本以后则默认是Lax了。这也是为什么chrome升级以后,程序突然异常的缘故。

二、解决方案

1、修改浏览器设置
这种方法简单粗暴,直接将浏览器的SameSite的属性设置回到以前的None状态。姑且不论用户是否愿意,但单就每台机的浏览器都要进行设置而言,已经违背了BS架构应用的最大优点,就是客户端无须安装部署这一宗旨。所以我觉得这是一个实在没有别的办法的时候,才不得不采取的措施。

设置方法如下:

1)chrome地址栏输入chrome://flags
2)通过禁用“SameSite by default cookies”和“Cookies without SameSite must be secure”功能开关
3)重新启动浏览器

2、Set-Cookie:SameSite=None
就是将response的header设置Set-Cookie:SameSite=None。

Set-Cookie: SameSite=None; Secure

Set-Cookie

这里有个疑问,谁来设置这个set-cookie?以上述我们项目为例,A项目的页面用iframe嵌入了B项目的页面,是A项目来设置set-cookie还是B项目?应当是B。因为嵌入的是B项目的页面,response来自B服务器,A使不上劲。

注意必须同时设置Secure属性(Cookie 只能通过 HTTPS 协议发送),否则无效。这意味着,B项目必须采用https?不过我试了几下,发现没什么效果。也许我的A项目本身是http,需要A和B都为https才可以?不清楚。

不过有个设置 SameSite 为 none的实例。以 Adobe 网站为例:https://www.adobe.com/sea/,查看请求可以看到:

3、Nginx做网站映射
(我习惯叫映射,但一般叫做转发)
SameSite策略针对的是不同站的请求,同站就没有问题。那么A项目嵌入B项目的页面,将B站点映射为同一个站点不就好了?同站与同源(非跨域)是不一样的,我感觉同站比同源要严格一些。解决同源问题,即跨域问题,顶级域名相同就可以了;同站的话,域名要保持一致,端口可以不一样,所以如果映射为同站,可以域名或IP相同,端口不同。

同站与同源的区别很复杂,可以看看这里。

映射站点的不二选择,当然是Nginx了。比如A项目在我本地,http://localhost:8081,现在嵌入了B项目的页面,B项目地址为http://192.168.0.248:8082/,现在需要映射为http://localhost:8082。

1)新建一个Nginx的配置文件【nginx所在目录】/conf/nginx2.conf

worker_processes  1;error_log  logs/error.log debug;events {worker_connections  1024;
}http {server {listen       8082;  server_name  localhost;  location / {proxy_pass http://192.168.0.248:8082/;}}
}

2)运行nginx

nginx.exe -c D:\soft\nginx-rtmp-win32-1.2.1\conf\nginx2.conf

映射之后,A项目嵌入的B项目页面改用新地址,浏览器就以为它们是同一站点,放松警惕,该干啥干啥了。

三、总结

谷歌浏览器的这种同站策略是一种傲慢,虽然它也允许B服务器设置SameSite=None,但要跟https绑定。网络有互联网和局域网之分,安全从来都是相对的,要跟付出的代价一起衡量。在局域网中,A、B项目都是自己开发的,嵌入有何不可?https的话,要制作证书,本身是非常繁琐的。幸好其他浏览器还没有跟进。


2022.06.09
采用https的话,就算浏览器无法识别证书,数据仍然是加密传输的,安全可以得到保证。

Cookie 的 SameSite 属性
浏览器系列之 Cookie 和 SameSite 属性

chrome 同站策略(samesite)问题及解决方案相关推荐

  1. 禁止chrome浏览器自动填充表单的解决方案

    禁止chrome浏览器自动填充表单的解决方案 参考文章: (1)禁止chrome浏览器自动填充表单的解决方案 (2)https://www.cnblogs.com/ld-swust/p/5801606 ...

  2. 谷歌浏览器设置启动页被hao123劫持_win10系统打开chrome会被hao123劫持怎么办?解决方案...

    有位win10系统用户最近遇到了一个问题,他反馈有次重启电脑后,好像某某浏览器升级了,然后打开chrome浏览器主页就被hao123劫持了,试了很多方法都没有作用.这是怎么回事呢?原来,win10下任 ...

  3. Chrome游览器改变SameSite设置

    Chrome浏览器改变SameSite设置 Chrome 默认将没有设置SameSite设置为SameSite=Lax SameSite取值 Strict Strict完全禁止第三方Cookie,跨站 ...

  4. 运行无法打开计算机策略,“组策略不能打开”的解决方案

    [问题描述]: 组策略不能打开 [解决方案]: 方案一: 首先看一下电脑是否中毒,清理一下木马.用360杀毒进行全盘扫描.(如图1)如检测出病毒处理后重启.看看能否打开组策略. 图1 方案二: 在启动 ...

  5. Chrome 的7大缺陷以及相关解决方案

    Chrome 的7大缺陷以及相关解决方案 作者:Eyon 有 54 人喜欢此条目 Chrome 已经整整发布了两年多时间,虽然在这期间以速度和优雅的界面赢得了很多用户的请来,但仍然有很多不足的地方.这 ...

  6. 海康威视、浙江大华摄像头RTSP Chrome、Firefox网页低延迟播放解决方案

    海康威视.浙江大华摄像头RTSP Chrome.Firefox网页低延迟播放解决方案

  7. IBM Cloud:裸金属服务器+多云策略助力音视频解决方案成功出海

    点击上方"LiveVideoStack"关注我们 到底什么是公有云.私有云和混合云?疫情给云服务厂商带来了哪些挑战?IBM是如何助力音视频解决方案成功出海的?"后疫情&q ...

  8. Chrome更新后有些字体看不清解决方案

    阿酷TONY / 2023-3-30 / 长沙  / 原创 症状:Chrome更新至版本Chrome 109.0.5414.120 字体看不清. 原因猜测:似乎是网页不能识别宋体等某些字体,这些字体被 ...

  9. 关于chrome等浏览器不支持showModalDialog的解决方案

    目前,新版本的chrome和opera.Firefox等浏览器已经不支持showModalDialog方法. 如果是没有接收返回值的,可以直接将window.showModalDialog改为wind ...

  10. Django - - 进阶 - - 同源策略和跨域解决方案

    目录 同源策略 一个源的定义 同源策略是什么 举个例子 jQuery中getJSON方法 JSONP应用 1, 同源策略 1.1 一个源的定义 如果两个页面的协议,端口(如果有指定)和域名都相同,则两 ...

最新文章

  1. 财务大数据比赛有python吗-【教改实验班简介】财务大数据分析班
  2. 设计师必备网址 百度MUX
  3. in的绑定 mysql_MySQL IN语句的PDO绑定值
  4. 20140710文安c++面试总结
  5. vue 模板 html 表达式,Vue 模板template、指令directive、修饰符
  6. 网易容器云平台的微服务化实践
  7. 【kafka】kerberos认证下 kafka 报错Bootstrap broker host:ip (id: -1 rack: null) disconnected
  8. 突破大文件上传 和内网ip的端口转发
  9. 微服务架构如何实现网站服务垂直化拆分
  10. 22.TCP/IP 详解卷1 --- TCP 的坚持定时器
  11. JavaScript:获取帧率FrameUtil.js
  12. CPDA数据分析师:一个完整的数据分析流程
  13. 一.什么是java面向对象 (小白神器)
  14. PPT如何制作形状动画?
  15. android 锁屏后定时器,iOS锁屏或者后台计时器定时解决方法
  16. 实现手机浏览器跳转微信关注公众号
  17. Python 获取动漫番剧 -XXOO
  18. 1026. 多米诺和三格骨牌铺瓦问题
  19. 比pgload更快更方便写入大数据量至Greenplum的Greenplum-Spark Connector
  20. onmouseover 事件

热门文章

  1. 创新思维案列分析——苹果公司
  2. 国内有哪些不错的CV(计算机视觉)团队
  3. app开发预算究竟多少?看你多花了多少冤枉钱
  4. 论文阅读《SHINE: Signed Heterogeneous Information Network Embedding for Sentiment Link Prediction》
  5. 房贷新政刺激换房需求 北京楼市成交量反弹
  6. 图扑软件构建源网荷储用体系 打造循环经济2.0版本
  7. 去水印小程序源码,全新界面无加密,平台支持微信小程序和QQ小程序。支持解析抖音、快手、皮皮虾和微视等平台。带PHP下载接口。支持微信QQ流量主
  8. php中empty检测非空,php empty() 检查一个变量是否为空
  9. logback springProperty 标签不起作用
  10. 哔哩哔哩mac客户端!亲测!支持big sur系统