【发布时间】:2020-05-29 16:54:22
【问题描述】:
我在 example.com 上托管了一个单页静态应用程序。我的应用程序服务器托管在 server.com 上。我将这两个服务完全分开,它们可以通过这种方式进行不同的扩展。当用户想要登录时,他们的用户名和密码被传递到 yoyoma.com,并在 server.com 上设置一个带有 access_token 的 cookie。然后用户被重定向到 example.com 并且现在已经登录。
从 example.com 上的静态应用程序,我们现在可以向 server.com 发出 AJAX 请求,并设置 Credentials=true,以便我们设置的 access_token 传递给 server.com。这在除 Safari 之外的所有浏览器中都能完美运行。我让 Safari 工作的唯一方法是转到首选项 -> 隐私 -> 禁用“防止跨站点跟踪”。我知道 cookie 是在 server.com 上设置的,但它们没有通过 AJAX 请求传递。这似乎是苹果认为非常棒的一些隐私功能,但你应该如何解决这个问题。我不是广告服务,我没有做任何坏事,只是想让我的应用程序正常工作。我特别想构建一个单页应用程序,其中服务器位于不同的域中。这在 Safari 中是否可行,或者他们的隐私设置使这变得不可能?
注意:我还应该向安全狂热者提一下,当设置 access_token cookie 时,用户会被重定向到带有 CSRF 令牌的 example.com。此 csrf 令牌通过标头在每个 AJAX 请求中传递,以防止跨站点请求伪造。
【问题讨论】:
-
“……Apple 认为非常棒的一些隐私功能……”。不仅仅是苹果。用户只能容忍跨站点跟踪,因为他们不知道这对他们的隐私有多大的侵犯性。 :-)
-
我希望所有浏览器都这样做。我不希望任何人跟踪我,广告与否。您应该通过 example.com 将其发送回来,然后让 example.com 向 server.com 发出请求
-
那么,您建议如何存储 access_token。 Server.com 无法在 example.com 上设置 cookie。如果您只是将 access_token 返回给 example.com,那么您不能将其与 HttpOnly 标志一起存储,因此您对 XSS 是开放的。我现在要做的是存储在 example.com 上的 CSRF 令牌,这将阻止 CSRF,并且存储在 server.com 上的 access_token 可以防止 XSS。那么,当 example.com 没有服务器元素时,如何在 example.com 上存储 HttpOnly cookie?
标签: ajax cookies safari cross-domain csrf