chrome浏览器跨域Set-Cookie之SameSite问题
使用chrome浏览器访问 a.com,而 a.com 请求了 b.com 的资源。(有可能是ajax,也有可能是 iframe,jsonp,跨域图片 ,跨越表单等)
此时,b.com 响应了 Set-Cookie: PHPSESSID=klg1e5p01tl59sovdfr58t5slm; path=/
chrome提示:
此Set-Cookie标头未指定"SameSite"屋性,它默认为'sameSite=Lax"并被阻止,因为它来自跨站点响应,而不是对顶级导航的响应。必须为此Set-Cookie设置"SameSite=None"才能实现跨站点使用。
然后,试了一下以下写法(php73以后):
setcookie('cross-site-cookie', 'name', ['samesite' => 'None', 'secure' => false]);
然后,再看看chrome提示:
尝试通过Set-Cookie标头设置Cookie时被阻止,因为它具有"SameSite=None"用性,但没有使用"SameSite=None"所必需的"Secure"属性。
如果使用了 secure,则必须为 https 链接,也就意味着 b.com 必须是https。先把上面的 setcookie 中 secure 改为 true,然后 b.com 开启 https ,且在 a.com 请求时使用 https://b.com/xxx
然后发现,响应的 Set-Cookie 成功了。对比效果:
解释:
在chrome 80版本以上, 会默认开启same-site策略
samesite有以下几个值
- Lax : 对同源、顶级域的请求才可以携带cookie (等价于same-site)
- Strict: 对同源请求才可以使携带cookie (等价于same-origin)
- None: 对于cookie的使用无限制,随便使用(但是需要 https 连接)
在 php73 以上,setcookie支持 samesite 属性,当然你也可以使用 header 函数设置:
header("Set-Cookie: 键=值; expires=过期时间; path=/; domain=.sina.net; SameSite=None; Secure");
if (strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome/8') !== false) {
$expireTime=gmdate("D, d M Y H:i:s", time()+SID_COOKIE_EXPIRE)." GMT";
header("Set-Cookie: SID=".$mailSid."; expires=".$expireTime."; path=/; domain=.sina.net; SameSite=None; Secure");
Secure");
}
文章作者: 朱丰华
文章链接: https://smart.52dixiaowo.com/blog/post-44.html
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。