csurf 中间件如何验证令牌?

6 csrf node.js express

我正在测试NodeJS express使用csurf包和express-session包的应用程序。

问题

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

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

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

Wil*_*ong 8

csurf工作原理是将令牌秘密存储到会话(在 的情况下express-session)或直接存储到 cookie(在 的情况下cookie-parser)。然后,服务器端应该使用动态生成的(每个请求)令牌通过req.csrfToken(). 这个 csrf 令牌是从令牌秘密派生出来的,以后可以验证。

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

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