7

在我们的 Rails 应用程序中,用户通常会一次打开多个浏览器选项卡数小时或数天。当在这些选项卡之一中,用户注销然后重新登录(或会话到期并创建新会话)时,就会出现问题。

这会导致所有其他选项卡上的 CSRF 真实性令牌变得无效。如果他们尝试提交任何表单或在这些选项卡上发出任何 ajax 请求而不刷新,他们将得到一个错误(实际上会被注销,因为这是传递错误真实性令牌时的默认 Rails 行为)。

这种行为显然是不可取的。我想知道人们如何优雅地处理用户打开您网站的窗口但真实性令牌已过期的情况。

我不想做的只是将他们重定向到登录页面,因为那样他们可能会丢失他们的工作,例如,如果他们一直在写一篇很长的博客文章或其他东西。

想到的解决方案是使用一些 javascript 来轮询服务器以检查真实性令牌是否已更改,或轮询用户的 cookie 以检查会话是否已更改。我从来没有听说过有人这样做,所以我想看看社区是怎么想的。

4

2 回答 2

3

首先:登录/注销/登录不会导致出现新的 csrf-token。它仍然会保存在用户的 cookie 中。下次它通过同一个浏览器登录时,它会得到相同的令牌。

在最新版本的 Rails 中,在令牌不正确的情况下不会抛出错误:所有 Rails 都会做——只是在将会话传递给控制器​​之前重置会话。

所以,更新你的 Rails,你会少一点痛苦。

于 2012-05-04T19:03:54.780 回答
3

您确定您在谈论 CSRF 令牌而不是会话令牌吗?在 CSRF 令牌不匹配时重定向到登录根本没有任何意义。你只是告诉用户重复他试图做的任何事情。(在传统的 Web 应用程序中,这通常在提交表单时出现;您可以将 CSRF 不匹配视为验证错误,并再次显示表单,保留所有字段值,并要求用户重新提交。在更多的 AJAX - 重型应用程序,您可以在响应中使用某种通用 CSRF 标志,如果已设置,请用户再次执行他所做的任何事情(按下按钮等),甚至可以在不打扰用户的情况下自动化整个事情。

于 2012-05-04T19:07:50.183 回答