CSRF 在表单提交之前过期

信息安全 csrf 会话管理
2021-08-15 00:16:46

我有一个很长的网络表格,人们可能需要几个小时才能完成。这样做的问题是,当人们在完成之前 CSRF 令牌过期时间过长,并且当他们点击提交时,他们会收到 403 错误。

为了解决这个问题,我正在考虑每小时执行一次 AJAX 请求来更新会话并延长令牌到期时间。这样做有什么安全问题吗?或者有没有更好的方法来处理这种情况?

4个回答

这绝对存在安全问题;否则,会话超时将毫无用处。

也就是说,禁用会话超时可能有充分的理由,但在这种情况下,您可以而且应该明确地这样做,并充分考虑所有后果。

添加到解决方案:虽然我认为在一个网页上拥有一个需要很长时间才能填写而不同时保存的表单已经存在问题,但是当出现任何问题时可能会丢失整个工作(大可用性问题),我认为您想要实现的是通过在用户仍然处于活动状态时每隔一段时间执行一次 ajax 请求来延长会话(从而延长 csrf 令牌的有效性) 。因此,您应该监控是否有任何表单字段发生更改(例如,在过去 5 分钟内),然后才启动 ajax 请求。

CSRF token 不需要设置独立的过期时间,token 需要对当前用户会话唯一有效,当用户会话过期时,csrf token 会随着会话过期,然后必须生成一个新的令牌。这可能是一个简单的解决方案。

当用户离开表单一段时间并为每个请求启用 CSRF 时,对我有用的解决方案是在请求失败时在 AJAX Success 中发出 GET 请求,因为令牌已过期。然后有一个隐藏字段继续使用最新令牌更新,如果在发出请求时它已过期,您发出 GET REQUEST 以获取最新令牌,然后在提交表单的函数上调用 click 事件,这意味着该函数必须是将“this”或ID作为部分参数传递。这使得用户无法在后台实现更新令牌的过程

有关更一般的答案,请参阅Nicolai Ehemann的答案。此答案假定正在刷新令牌而不会延长会话。


我认为这没有问题。它实际上与用户重新加载页面时重置令牌相同。假设您使用 https 并正确实现了 ajax 请求和令牌生成,攻击者应该仍然不知道用户令牌是什么。

与正常生成没有 ajax 的 CSRF 令牌时的风险相同,因为对于浏览器来说,它基本上是在做同样的工作。