chrome: Indicate whether to send
问题描述
访问一个内嵌iframe
的html
页面,iframe
指向的地址是一个完整的系统,有登录注册等页面。登录的时候发现始终失败,页面不跳转,chrome
报错如下:
cookie
跨域了,带不过去。
But
,内嵌的系统单独可以正常运行,火狐浏览器可以正常运行。
chrome
版本:
原因分析
Google
在2020年2月4号发布的 Chrome 80 版本中默认屏蔽所有第三方Cookie
,即默认为所有 Cookie
加上 SameSite=Lax
属性,并且拒绝非Secure
的Cookie
设为 SameSite=None
。
解决办法
1 设置cookie
属性SameSite=None and Secure
---最根本也是最推荐的
其实这是chrome
浏览器给的解决办法。
那么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
属性会打勾。
所以,这个办法还要配合升级
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内嵌页面异常