我正在测试将NodeJS express
软件包与csurf
软件包一起使用的express-session
应用。
问题
在进行测试时,我必须发出包含csrf token
的请求,但是由于我并不真正了解csurf
中间件如何验证传入请求中的csrf tokens
,因此会导致在测试应用程序时会遇到很多问题。
问题
有人可以简单地解释一下,当将csurf
中间件与csrf tokens
软件包一起使用时,csurf
中间件如何验证express-session
?在请求中接收令牌时如何验证令牌?令牌应该在标头中还是在请求正文中发送?每次呈现新页面时都会创建新令牌吗?还是每个用户会话只有一次令牌?
我还想知道当使用csurf
软件包的cookie-parser
中间件时令牌验证过程将如何改变?
答案 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 的后退按钮问题可能不是问题,因为它使用秘密机制来生成/验证令牌(允许旧令牌进行验证)。
csurf 文档说 only send down the CSRF token once on the route that renders the page