由于最近在做项目的时候,突然就发现用flash插件上传附件的时候导入失败了,在浏览器的控制台上给错的错误码是302,在仔细查看以后并没有传送相应的cookie值,于是就去网上查了很多资料,最终也没有得到一种很好的解决方案,先把自己在网上查阅的资料分享给大家!
Chrome80之后更新了cookie的携带机制,把原来的SameSite属性,由None改成了Lax,这就导致了一些需要使用到第三方cookie的应用产生了异常。
而SameSite则有三个值分别为Strict、Lax、None
1.Strict
Strict是最为严格的,它完全限制了所有的第三方Cookie,在任何的跨域调用时都不会去传输Cookie。只有在指定URL后,才会带上Cookie,如果使用重定向的话Cookie是不存在的,我们后在拿不到Cookie的时候就会显示页面无状态,这样就导致flash插件上传失败的原因之一。
2.Lax
Lax并不像Strict那么严格,Lax在通过预加载,链接,GET请求的下传输Cookie
请求类型 | 示例 | 正常情况 | Strict | Lax | None |
---|---|---|---|---|---|
链接 | <a href="..."></a> | 发送Cookie | 不发送 | 发送Cookie | 发送Cookie |
预加载 | <link rel="prerender" href="..."/> | 发送Cookie | 不发送 | 发送Cookie | 发送Cookie |
GET请求 | <form method="GET" action="..."> | 发送Cookie | 不发送 | 发送Cookie | 发送Cookie |
POST请求 | <form method="POST" action="..."> | 发送Cookie | 不发送 | 不发送 | 发送Cookie |
iframe | <iframe src="..."></iframe> | 发送Cookie | 不发送 | 不发送 | 发送Cookie |
ajax | $.get("...") | 发送Cookie | 不发送 | 不发送 | 发送Cookie |
image | <img src="..."> | 发送Cookie | 不发送 | 不发送 | 发送Cookie |
设置了Strict或Lax以后,基本就杜绝了 CSRF 攻击。
从上面的表格可以看出,将SameSite的值从None改为Lax后,Form,Iframe,Ajax和Image中跨站的请求受到的影响最大。
3.None
Lax是默认的,如果想要关闭SameStite属性,就将其设置为None,前提是必须同时设置Secure属性(Cookie 只能通过 HTTPS 协议发送),否则无效。如果将其设置成None,大大增加了CSRF攻击的可能性。(不推荐)
设置地址(chrome://flags/#same-site-by-default-cookies)
参考连接
http://www.ruanyifeng.com/blog/2019/09/cookie-samesite.html
如果大佬们有好的解决方案,希望可以在评论区讨论!