csurf中间件如何验证令牌?

时间:2019-09-05 20:44:08

标签: node.js express csrf

我正在测试将NodeJS express软件包与csurf软件包一起使用的express-session应用。

问题

在进行测试时,我必须发出包含csrf token的请求,但是由于我并不真正了解csurf中间件如何验证传入请求中的csrf tokens,因此会导致在测试应用程序时会遇到很多问题。

问题

有人可以简单地解释一下,当将csurf中间件与csrf tokens软件包一起使用时,csurf中间件如何验证express-session?在请求中接收令牌时如何验证令牌?令牌应该在标头中还是在请求正文中发送?每次呈现新页面时都会创建新令牌吗?还是每个用户会话只有一次令牌?

我还想知道当使用csurf软件包的cookie-parser中间件时令牌验证过程将如何改变?

2 个答案:

答案 0 :(得分:1)

csurf的工作方式是将令牌密钥存储在会话中(对于express-session)或直接存储在cookie中(对于cookie-parser)。然后,服务器端应通过req.csrfToken()使用动态生成的(按请求)令牌来呈现网站。此csrf令牌是从令牌机密派生的,可以稍后进行验证。

当调用csurf受保护的端点时,客户端应通过正文或标头包含此令牌(请参阅默认值here)。然后,中间件将从会话或cookie中获取令牌密钥,然后验证它是由用户拥有的密钥生成的有效令牌。如果验证失败,将抛出csrf错误。

由于生成的csrf令牌不是时间敏感的,因此对于单元测试,您实际上可以将相同的令牌密钥硬编码到会话或cookie中,一次调用req.csrfToken()以接收有效的令牌,然后进行硬核并继续重复使用相同的令牌每次测试。

答案 1 :(得分:0)

是否为每个请求或每个用户会话颁发 CSRF 令牌似乎是一个有争议的领域,甚至 this stackoverflow security question 上的前两个答案也对此事持不同意见。

底线:

我们应该始终遵循 OWASP 的建议,其中指出 per request CSRF tokens are more secure, but not necessary and can cause other problems

<块引用>

CSRF 令牌应在服务器端生成。它们可以为每个用户会话或每个请求生成一次。每个请求令牌比每个会话令牌更安全,因为攻击者利用被盗令牌的时间范围很小。但是,这可能会导致可用性问题。

...

值得注意的是,csurf 的后退按钮问题可能不是问题,因为它使用秘密机制来生成/验证令牌(允许旧令牌进行验证)。

最后,如果您正在构建 SPA:

csurf 文档说 only send down the CSRF token once on the route that renders the page