Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我要将CSRF令牌放入JWT令牌中?_Javascript_Cookies_Csrf_Jwt_Owasp - Fatal编程技术网

Javascript 为什么我要将CSRF令牌放入JWT令牌中?

Javascript 为什么我要将CSRF令牌放入JWT令牌中?,javascript,cookies,csrf,jwt,owasp,Javascript,Cookies,Csrf,Jwt,Owasp,我想从解释将JWT存储在localStorage或Cookie中的优缺点的角度,对JWT令牌和CSRF提出疑问 […]如果您使用JS从cookie中读取值,这意味着您 无法在cookie上设置Httponly标志,因此现在您的站点上有任何JS 可以读取它,从而使其与存储完全相同的安全级别 本地存储中的一些东西 我试图理解他们为什么建议将xsrfToken添加到 JWT。不会将JWT存储在cookie中,然后提取它 取出JWT并将其放入HTTP头中,并验证 基于HTTP头的请求完成与 Angula

我想从解释将JWT存储在localStorage或Cookie中的优缺点的角度,对JWT令牌和CSRF提出疑问

[…]如果您使用JS从cookie中读取值,这意味着您 无法在cookie上设置Httponly标志,因此现在您的站点上有任何JS 可以读取它,从而使其与存储完全相同的安全级别 本地存储中的一些东西

我试图理解他们为什么建议将xsrfToken添加到 JWT。不会将JWT存储在cookie中,然后提取它 取出JWT并将其放入HTTP头中,并验证 基于HTTP头的请求完成与 Angular的X-XSRF-TOKEN?任何其他域都无法在服务器上发出请求 用户代表如果您基于标头中的JWT进行身份验证, 因为其他域无法从cookie中提取JWT。我不 理解JWT中xsrfToken的用途——也许它只是 额外的防御层-意味着攻击者必须 在你的网站上有一个被破坏的脚本,同时CSRF有一个用户。所以 他们必须以两种方式攻击你才能发动攻击

这篇文章链接在哪里,上面写着:

最后一件事是确保您在每台计算机上都有CSRF保护 HTTP请求,以确保启动请求的外部域 您的站点无法运行

[…]然后,在服务器中的每个请求中,确保您自己的 JavaScript代码读取cookie值,并将其设置为自定义值 报头,例如X-CSRF-Token,并在中的每个请求上验证该值 服务器外部域客户端无法为设置自定义头 请求到您的域,除非外部客户端获得授权 通过HTTP选项请求,因此任何CSRF攻击企图(例如 一个IFrame(无论什么)对他们来说都会失败

即使他们可以设置自定义头,也无法访问存储JWT令牌的cookie,因为只有在同一域上运行的JavaScript才能读取cookie

唯一的方法是通过XSS,但是如果存在XSS漏洞,那么JWT中的xsrfToken也会受到损害,因为在受信任的客户端域中运行的恶意脚本可以访问cookie中的JWT,并在请求中包含带有xsrfToken的头

所以方程应该是:

  • 存储在安全cookie中的TLS+JWT+JWT在请求头中+无XSS漏洞
如果客户端和服务器在不同的域中运行,则服务器应发送JWT,客户端应使用JWT创建cookie。 我认为这个等式在这种情况下仍然有效

更新:

由于浏览器不会自动将标题添加到您的请求中, 它不易受到CSRF攻击


我是Stormpath博客文章的作者。在JWT中存储XSRF令牌并不是关于它在JWT中,而是关于它在cookie中。cookie应该是httpOnly,因此您不能从Javascript读取它

现在,我想引起一点混乱的是,我谈论的角度。Angular设置只有XSRF cookie(不是httpOnly)在请求时将其放入头中(只能由同一域上的javascript完成)。这些不是同一块饼干

如果您考虑在应用程序中实现XSRF支持,那么存储服务器端状态和XSRF的存储点已经完成了。将其存储在httpOnly cookie中意味着使用XSRF是无状态的。在这里,您将验证JWT签名,从声明中获取XSRF,并将其与标头进行比较


您的问题的答案是,您不需要在服务器上存储状态

我的理解是:

  • Store JWT是一个仅用于http的cookie
  • 在该JWT中,存储XSRF令牌的哈希版本
  • 在客户端登录时向其发送XSRF令牌,以便将其存储在本地存储中
  • 稍后,当客户端发送请求时,JWT会通过cookie随每个请求一起自动发送,然后您还可以通过头或查询变量发送XSRF令牌,并在服务器端重新散列以与服务器上JWT中的内容进行比较

您的JWT在XSS中不会被偷,您也会受到XSRF的保护。XSS仍然可以在浏览器上执行,但只会对浏览器中的该会话造成损害。最终,您无法阻止某人编写一个只在您的浏览器上运行的非常详细的脚本,因此web开发人员仍然需要传统的安全措施来保护免受XSS攻击。

感谢您的回答,您写了一篇很好的文章!我仍然不明白为什么需要XSRF令牌。也许如果你分享一个具体的案例,将JWT存储在非httpOnly cookie中,并将其以头的形式发送回服务器(带有TLS和无XSS漏洞),那么用户可能会在没有通知的情况下发出恶意请求。只是发布了一个答案。请让我知道你的想法。我是JMU的毕业生,也是Tom:)JWT中显式XSRF的缺点是它会增加大小。为什么不直接使用JWT的散列作为XSRF令牌呢?毕竟,如果攻击者只能读取https cookies,那么您的XSRF令牌不会增加多少价值。您可以在没有服务器端状态和附加cookie大小的情况下验证该哈希。@Tom quick one,您认为我们应该使用xsref cookie并验证我们是否使用jwt进行身份验证,这是正确的!我在这里用这种方法写了一个关于漏洞表面积的答案:还有,去公爵吧!:)我仍然对此感到困惑。那么,这是一种安全的技术吗?另外,我不明白为什么我需要csrf。因为如果我存储在本地存储库中,那么它是可见的。你能指出一个例子的方向吗!那么,为什么不将jwt存储在本地存储器中,将XSRF令牌存储在HttpOnly Coockie中呢?这样,jwt的有效性只有在