问题描述
访问一个内嵌iframe的html 页面,iframe 指向的地址是一个完整的系统,有登录注册等页面。登录的时候发现始终失败,页面不跳转,chrome 报错如下:
error
cookie 跨域了,带不过去。
But ,内嵌的系统单独可以正常运行,火狐浏览器可以正常运行。
chrome 版本:
chrome
原因分析
Google在2020年2月4号发布的 Chrome 80 版本中默认屏蔽所有第三方Cookie,即默认为所有 Cookie 加上 SameSite=Lax 属性,并且拒绝非Secure的Cookie设为 SameSite=None。
解决办法
1 设置cookie属性SameSite=None and Secure ---最根本也是最推荐的
其实这是chrome 浏览器给的解决办法。
SameSite
那么SameSite和Secure到底是什么意思呢?
Secure
安全性,指定Cookie只能通过https协议访问,一般的Cookie使用HTTP协议即可访问。设置了Secure (没有值),只有当使用https协议连接时cookie才可以被页面访问。可用于防止信息在传递的过程中被监听捕获后信息泄漏。
SameSite
Chrome浏览器在51版本后为 Cookie 新增的属性,用来防止 CSRF 攻击和用户追踪,从源头屏蔽 CSRF漏洞。可以设置三个值:Strict、 Lax、 None。
-
Strict:完全禁止第三方Cookie,跨站点时,任何情况下都不会发送Cookie。换言之,只有当前网页的URL与请求目标一致,才会带上Cookie。 -
Lax:规则稍稍放宽,大多数情况也是不发送第三方Cookie,但是导航到目标网址的Get请求除外。
设置了Strict或Lax以后,基本就杜绝了 CSRF 攻击。当然,前提是用户浏览器支持 SameSite属性。
-
None:Chrome计划将Lax变为默认设置。这时,网站可以选择显式关闭SameSite属性,将其设为None。不过,前提是必须同时设置Secure属性(Cookie只能通过HTTPS协议发送),否则无效。
HttpOnly
当然,Cookie能够获取有一个大前提,不设置HttpOnly 属性。如果在Cookie中设置了HttpOnly属性,通过程序(JS脚本、Applet等)将无法读取到Cookie信息,防止程序获取cookie后进行攻击。
配置的Secure、SameSite和HttpOnly值,均可以在chrome里看到:HttpOnly属性会打勾。
cookie
所以,这个办法还要配合升级
https协议才可以哦。
Secure和SameSite的nginx配置如下:
http {
map $http_user_agent $samesite_attr {
"~*chrome" ';Secure;SameSite=None';
}
server {
location / {
...
proxy_cookie_path ~/(.*) "/$1$samesite_attr";
}
}
}
2 将两个系统部署在同一台服务器或通过nginx转发,通过相同IP同源策略传送cookie。---次优解决办法
3 既然这个问题是谷歌浏览器特有的,可以不使用谷歌浏览器或者将谷歌浏览器降级到 Chrome 79 及以下版本,并关闭自动更新。
不是很建议,毕竟是前端,怎么着也得搞定浏览器兼容性吧,而且不能阻止客户不用呀。
参考:
nginx 为chrome客户端请求加SameSite=None;Secure
chrome浏览器跨域Cookie的SameSite问题导致访问iframe内嵌页面异常












网友评论