【问题标题】:How to protect JWT against XSRF using HTTPOnly Cookies?如何使用 HTTPOnly Cookie 保护 JWT 免受 XSRF 攻击?
【发布时间】:2017-04-06 19:21:28
【问题描述】:

我的 Ionic/angular 2 应用程序在 localhost:8000 上运行,该应用程序最终将在浏览器平台上运行。该应用程序正在调用托管在我的本地计算机上的https://adawy/api 上的RESTFull api,其中adawy 是我的主机名,并在hosts 文件和apache 虚拟主机中定义。服务器端是 Slim 3。

身份验证后的 API 返回一个用于所有请求的 JWT。

我的目标是保护令牌免受跨站点请求伪造和跨站点脚本的影响。将令牌保存在 javascript 变量或任何形式的本地存储中将使 JWT 可以从 javascript 访问。

我发现最好的方法是将 JWT 作为 HTTPOnly cookie 返回。因此,它无法从 javascript 访问,并且只能由浏览器发送,其中包含对 adawy 域的任何即将到来的请求。

我已成功将令牌作为 cookie 返回,但问题是 cookie 没有随任何下一个 XHR 请求一起发送。

另外,我在 Devtools 的 Cookies 部分中看不到 cookie。

我知道 angular 可以通过查找 XSRF-TOKEN cookie 来支持此类问题。 它也不起作用,如您所见,我将 cookie 的名称设置为 XSRF-TOKEN,但是对于任何其他请求,都不会发送此 cookie。

我想知道如果 Angular 可以访问此 cookie 时如何保护它,那么任何其他脚本也可以吗?

这是下一个请求,没有发送 cookie。请忽略标题Authorization,因为我的角度代码直接设置它。

在我的 Angular 应用程序中,我在发出最后一个获取请求时设置了 withCredentials: true 选项。

更新 我使用了adawy.com,但我仍然遇到同样的问题。

【问题讨论】:

    标签: php angular cookies ionic2 x-xsrf-token


    【解决方案1】:

    第一个响应尝试在顶级域 Domain=.adawy; 上显式设置 cookie(请参阅 Set-Cookie 标头),这是不允许的。如果可以,请尝试在没有域的情况下设置它,看看是否有效。或者,尝试使用带有 tld 的主机名。

    【讨论】:

    • 感谢您的回答。我将域更改为adawy,com,但我仍然遇到同样的问题。
    • Chrome doesn't support CORS exceptions for requests originating from localhost。看起来像this issue was closed in 2014 as won'tfix。显然Access-Control-Allow-Origin: * 将适用于 localhost,因此您可以完成测试,但 localhost 是不行的。
    • 我偶然发现了这个问题,这就是我使用adawy.com 作为主机名的原因。我想我的 cookie 设置本身一定有问题。然而,我无法弄清楚。
    • 目标主机名不是问题。 Chrome 不支持 来自 localhost 的 CORS 请求。查看 Chrome 在请求中发送的 Origin: http://localhost:8000 标头。
    • 这取决于您如何设置名称。如果 Chrome 可以告诉它托管在本地主机上,它将应用更严格的规则。只要 Chrome 可以判断它是在本地托管的,您仍然应该在请求标头中看到 Origin: http://localhost:8000。您可能需要问另一个关于如何使用 Slim 3 完成此任务的问题,因为这不是我的专业领域。解决名称解析问题后,Chrome 应该停止将 localhost 声明为 Origin,并且事务应该可以正常工作。
    猜你喜欢
    • 2011-10-02
    • 2018-09-08
    • 2020-05-12
    • 2016-10-28
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    相关资源
    最近更新 更多