Angular 和 PHP JWT 和 CSRF (XSRF) Cookie

Posted

技术标签:

【中文标题】Angular 和 PHP JWT 和 CSRF (XSRF) Cookie【英文标题】:Angular and PHP JWT and CSRF (XSRF) Cookies 【发布时间】:2016-08-28 21:18:51 【问题描述】:

我有一个 Angular 应用程序向 php 服务器发出 $http 请求。一旦向服务器提交了一个有效的登录请求,PHP 就会创建一个 JWT 并 使用 PHP 的 setcookie() 函数设置令牌 cookie,并将 httponly 标志设置为 true。此标志只允许服务器读取 cookie。在每个后续的 Angular $http 请求中,cookie 都由 PHP 使用 $_COOKIE 进行验证。

我的问题是在 PHP 中设置 cookie 以便仅服务器从 CSRF 读取足够安全,或者我是否需要让 Angular 创建一个额外的 XSRF 令牌以在每个请求上发送以进行评估?

我阅读了以下Stormpath article,但对他为什么在 JWT 有效负载中设置 xsrfToken 有点迷茫。我的猜测是让 Angular 创建一个 XSRF 令牌来匹配。

感谢您的任何建议/意见。

【问题讨论】:

【参考方案1】:

CSRF 攻击利用浏览器在每次请求时自动将您的身份验证 cookie 发送到服务器这一事实来进行攻击。通常,JWT 不会使用 cookie 传递给服务器,而是通过 http 请求的身份验证标头传递(它可能存储在客户端的 cookie 中,但 cookie 不用于将 JWT 传递给服务器)。由于您需要为每个请求设置身份验证标头,因此 CSRF 攻击无法对其恶意请求进行身份验证,因为浏览器不会自动为每个请求发送身份验证 cookie。这就是 JWT 有助于防止 CSRF 攻击的原因。

也就是说,如果您将 JWT 存储在 cookie 中并来回传输 cookie,提取令牌以检查授权策略,那么您与标准 cookie 身份验证一样容易受到 CSRF 攻击。在这种情况下,您可以将防伪令牌添加到您的请求中,以确保您的服务器收到的任何 HTTP 请求都直接来自您的网站。

【讨论】:

感谢您的回答。我在 PHP cookie 中设置 JWT 并使用 PHP $_COOKIE['token'] 访问它以对每个请求进行身份验证,根据您的回答,这确实打开了 CSRF 攻击的可能性。所以我猜测通过传递存储在cookie中的XSRF令牌并将其传递到请求标头中并在PHP中验证它,除了JWT cookie之外,这将消除CSRF攻击的可能性? 正确。添加防伪令牌和 cookie 您的请求(并验证它们)将保护您免受 XSRF 攻击,并且将包含 JWT 的 cookie 设置为 HttpOnly 将保护该 cookie 免受 XSS 攻击。 我很确定情况就是这样。再次感谢您的确认。

以上是关于Angular 和 PHP JWT 和 CSRF (XSRF) Cookie的主要内容,如果未能解决你的问题,请参考以下文章

JWT 和防伪令牌

Angular集成Spring Boot,Spring Security,JWT和CORS

了解 JWT 和 HTTP 授权标头? (客户端:Angular,服务器:php)

带有 PHP 和 Angular.js 的 JWT(JSON Web 令牌)

如何使用 HttpClientXsrfModule angular 6 添加 x-xsrf-token

CSRF 保护 - JWT 和 CORS 白名单组合是不是足够?