我在example.com上托管了一个单页静态应用程序。我用于该应用程序的服务器托管在server.com上。我将这两项服务完全分开,它们可以通过这种方式进行不同的扩展。当用户想要登录时,其用户名和密码将传递给yoyoma.com,并在server.com上使用access_token设置cookie。然后,该用户将重定向到example.com,并且现在已登录。
现在,可以从example.com上的静态应用程序中,使用Credentials = true将AJAX请求发送到server.com,以便将我们设置的access_token传递到server.com。在Safari之外的所有浏览器中,它都能完美运行。我使Safari正常工作的唯一方法是转到首选项->隐私->禁用“防止跨站点跟踪”。我知道cookie是在server.com上设置的,但是不会随AJAX请求一起传递。苹果公司认为这似乎是一些“隐私”功能很棒,但是您应该如何解决此问题。我不是广告服务,我没有做任何恶作剧,只是想让我的应用正常工作。我特别想在服务器位于不同域的情况下构建一个单页应用程序。在Safari中是否可行,或者其隐私设置使其无法实现?
注意:我还应该向安全狂热者提及,当设置了access_token cookie时,然后使用CSRF令牌将用户重定向到example.com。标头会在每个AJAX请求中传递此csrf令牌,以防止跨站点请求伪造。
答案 0 :(得分:1)
假设您要保留不同的域-并非完全不合理,有一些方法可以解决它,但是它们带有折衷办法
1
将example.com
重定向到呈现server.com/login
的服务器以创建httpOnly
cookie,然后将其重定向回到SPA中的登录状态。
据我了解,在Safari中启用Prevent cross-site tracking
时,其目的是在允许发送cookie之前让用户与其他域进行交互。
通过重定向它们,已经创建了该意图,并且设置cookie并由example.com
发送它应该没有问题。
2
查看与StorageAccess相关的讨论,因为此处的想法是与依赖来自不同域的cookie的第三方身份验证解决方案一起使用。 Safari ITP使得这些难于使用,因此其想法是与供应商合作,以寻求比LocalStorage
更好的解决方案。
3
将密钥存储在LocalStorage
中,并审查所有来自您的运行中的javascript代码,并确保在处理用户创建的值时遵循最佳做法。
LocalStorage
使您可能遭受XSS攻击,但Cookies使您遭受CSRF攻击。您必须减轻这些负担,但并不太难,但是请记住,在使用Cookie时您已经引入了这些向量。
发生的任何XSS都结束了,甚至带有httpOnly cookie。忘记您的身份验证密钥,运行攻击者代码可能会造成更大的破坏。
别误会,将LocalStorage
作为一般攻击转储起来比上面列出的攻击更容易
话虽如此,最后您花在处理Cookie问题上的资源最好用于加强在用户浏览器上运行的javascript,以确保它们没有运行恶意代码
尽管如此,您仍无法保护它们不受扩展名的影响,而httpOnly
cookie至少将确保它们的密钥不会泄漏。了解您的妥协。
编辑:请记住,无论采用哪种方法,对浏览器的任何进一步依赖都需要仔细考虑各种不同版本的浏览器。例如,不要假设使用httpOnly
cookie并设置sameSite
策略会否定CSRF
令牌的需求。除非它是受控环境,否则直到 为止,任何添加cookie都可能直到需要CSRF令牌作为标头为止。
个人意见松散。 不要伤害。 Cookies增加了您必须减轻的“危害” /工作。 Cookies可以防止泄露访问令牌的攻击,但是为什么攻击者可以在运行所需代码的同时关心访问令牌? XSS是LocalStorage的弱点,但Cookies不能避免这种情况。
是什么阻止他们仅使用密码? 弹出一个登录模式,向一个不会三思而后行的意外用户显示,Github有时会出于某些原因不时地这样做,这并非闻所未闻。