Node.js 为什么Express/Connect会在每次请求时生成新的CSRF令牌?

Node.js 为什么Express/Connect会在每次请求时生成新的CSRF令牌?,node.js,security,express,csrf,Node.js,Security,Express,Csrf,据我所知,有两种方法可以防止CSRF攻击:1)每个会话使用令牌,2)每个请求使用令牌 1) 在第一种情况下,当初始化用户会话时,仅生成一次CSRF令牌。因此,用户一次只有一个有效令牌 2) 在第二种情况下,每个请求都会生成新的CSRF令牌,之后旧的CSRF令牌将失效。 这使得利用该漏洞更加困难,因为即使攻击者窃取令牌(通过XSS),当用户转到下一页时,令牌也会过期。 但另一方面,这种方法使webapp的可用性降低。下面是一段很好的引语: 例如,如果他们点击“后退”按钮并提交带有新值的表单,提交将

据我所知,有两种方法可以防止CSRF攻击:1)每个会话使用令牌,2)每个请求使用令牌

1) 在第一种情况下,当初始化用户会话时,仅生成一次CSRF令牌。因此,用户一次只有一个有效令牌

2) 在第二种情况下,每个请求都会生成新的CSRF令牌,之后旧的CSRF令牌将失效。 这使得利用该漏洞更加困难,因为即使攻击者窃取令牌(通过XSS),当用户转到下一页时,令牌也会过期。 但另一方面,这种方法使webapp的可用性降低。下面是一段很好的引语:

例如,如果他们点击“后退”按钮并提交带有新值的表单,提交将失败,并且可能会向他们发送一些恶意错误消息。如果他们试图在第二个选项卡中打开资源,他们会发现会话在一个或两个选项卡中随机中断

在分析Node.js框架(基于)时,我注意到每个请求都会生成一个新的CSRF令牌, 但是旧的不会失效

我的问题是:在每个请求上提供新的CSRF令牌而不使旧令牌无效的原因是什么? 为什么不为每个会话生成一个令牌呢


谢谢你,对不起我的英语

CSRF令牌是nonce。它们应该只使用一次(或在长时间后安全使用)。它们用于识别和授权请求。让我们考虑防止CSRF的两种方法:

  • 每个会话固定一个令牌:这样做的缺点是客户端可以将其令牌传递给其他人。这可能不是因为嗅探、人在中间或安全失误。这是用户的背叛。多个客户端可以使用同一令牌。可悲的是,对此无能为力

  • 动态令牌:每当服务器和客户端之间发生任何交互或超时时,都会更新令牌。它防止使用较旧的令牌和多个客户端同时使用

  • 动态令牌的缺点是它限制了返回并从那里继续。在某些情况下,它可能是可取的,比如如果实现购物车,则必须重新加载以检查是否有库存。CSRF将阻止重新发送发送的表单或重复购买/出售

    细粒度控件会更好。对于您提到的场景,您可以不进行CSRF验证。那么就不要在特定页面上使用CSRF。换句话说,处理每条路由的CSRF(或其异常)

    更新

    我只能想到两个原因,为什么单个动态令牌比多个好:

  • 多个令牌确实更好,但至少有一个类似于上面的动态令牌。这意味着设计一个可能变得复杂的详细工作流程。例如,请参见此处:

  • 这些令牌用于访问其API(表单提交等),而不仅仅是登录。每一个都以不同的方式实现它们。除非有好的用例,否则不值得做。你的网页将大量使用它。更不用说提交表格现在已经不简单了

  • 动态单令牌是最简单的,也是库中最容易获得的。因此,您可以随时使用它

  • 多种代币的优点:

  • 可以实现事务。您可以在请求之间进行排序
  • 可以从超时和身份验证错误中回退(您现在必须处理它们)
  • 安全!比单个令牌更健壮。可检测令牌滥用、黑名单用户

  • 顺便说一下,如果您想使用多个令牌,您现在有OAuth2库

    谢谢你的回答,我真的很感激。但它没有描述多个有效令牌比单个有效令牌有什么优势。