javascript Safari即使设置SameSite=None后也不发送cookie;安全

hlswsv35  于 2023-05-05  发布在  Java
关注(0)|答案(7)|浏览(349)

我们的应用程序使用cookie来记住用户登录。我们进行的每个auth API调用,浏览器都会将服务器设置的HTTPonly cookie与API请求一起附加,并进行身份验证。这种行为似乎在莫哈韦释放后的狩猎中被打破。
我了解到safari实现的跨站点cookie安全性,我们的服务器团队在设置cookie时添加了SameSite=None;Secure。即使在那之后,它仍然不起作用。
Set-Cookie: my_cookie=XXXXX; path=/; secure; HttpOnly; SameSite=None
请建议或提供链接的人谁实际上找到了解决方案。

2izufjch

2izufjch1#

MacOS 10.14上的Safari版本和iOS 12上的所有浏览器都受this bug影响,这意味着SameSite=None被错误地视为SameSite=Strict,例如最严格的环境。
我在SameSite cookie recipes中发布了一些指导:

  • 使用两组Cookie来说明支持SameSite=None; Secure和不支持SameSite=None; Secure的浏览器。
  • 嗅探用户代理for incompatible browsers,而不为这些请求提供SameSite=None服务。
kq0g1dla

kq0g1dla2#

这也是Safari 14的问题。Safari不再默认发送第三方Cookie。这是因为他们引入了隐私偏好:“防止跨站点跟踪”,默认情况下已打开。因此,如果您使用SameSite=None; Secure设置Cookie,它们仍然不会被设置并跨域发送。

lh80um4z

lh80um4z3#

Safari不再发送跨站点Cookie。因此,即使cookie设置为SameSite=None,它也不会与第三方 AJAX 请求一起发送。
要允许发送跨站点Cookie,请转到Safari > Preferences > Privacy并取消选中Prevent cross-site tracking

tct7dpnv

tct7dpnv4#

问题不在于Safari是否发送Cookie,而在于Safari没有存储Cookie。这与cookie配置的特定组合有关,它与localhost的此设置一起工作
Set-Cookie: your=cookie; Domain=localhost; Path=/; Expires=Mon, 26 Dec 2022 12:53:02 GMT; HttpOnly; SameSite=Lax
而这个生产装置
set-cookie: your=cookie; Domain=something.com; Path=/; Expires=Thu, 22 Dec 2022 04:17:44 GMT; HttpOnly; Secure; SameSite=Lax
你需要在两者上都包含Domain,并为你的prod(ssl)env包含Secure。您可以为SameSite使用不同的值,但Lax对我来说是有效的

pb3skfrl

pb3skfrl5#

我试着在MAC OS中禁用“防止跨站点跟踪”选项(即,设置〉Safari〉隐私和安全〉防止跨站点跟踪-禁用),iframe开始工作。我知道这不是一个修复,但可能是一个快速的变通办法,为短时间。

hc8w905p

hc8w905p6#

我一直在努力弄清楚饼干,因为第一次开始在我们的网站上工作。我终于想通了。在我们的服务器上,我们在express应用程序中使用了firebase会话,它们的初始化方式如下:

app.use(
    session({
        name: "myCookie",
        store: new FirestoreStore({ dataset: firestore }),
        secret: process.env.SESSION_SECRET as string,
        resave: false,
        proxy: true,
        cookie: {
            maxAge: 1000 * 60 * 60 * 24 * 365 * 10,
            httpOnly: true,
            secure: process.env.PROD == "true",
            sameSite: 'lax',
            domain: "mydomain.com"
        },
        saveUninitialized: false,

    })
)

Cookie的设置对我们的iOS应用程序来说并不重要,但对我们的网站来说,我们有几个障碍。为了让它在桌面网站浏览器和Android上工作,我们必须将cookie设置为安全和httpOnly。但是,对于iOS移动的浏览器,cookie设置失败。问题是因为iOS上的移动的浏览器只使用第一方Cookie。我不得不为我们的API服务器添加一个CNAME,这是我们网站的一个子域,并直接调用该CNAME的API。然后,在我们的API中必须指定cookie的域(您必须显式地为cookie中允许的子域指定域)。这解决了它。

yfwxisqw

yfwxisqw7#

对于用Ruby编写的应用程序(特别是Rails、Sinatra或Rack上的任何东西),RailsSameSiteCookie gem很好地解决了这个问题和相关问题。代码读起来像是pseudocode in the Chromium discussion的近似翻译,没有脆正则表达式。

相关问题