ruby-on-rails - 如何在 Rails 中处理带有陈旧 CSRF 真实性 token 的页面

标签 ruby-on-rails session csrf

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

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

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

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

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

最佳答案

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

在最新版本的 Rails 中,在 token 不正确的情况下不会抛出错误:所有 Rails 所做的 - 只是在将 session 传递给 Controller ​​之前重置 session 。

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

关于ruby-on-rails - 如何在 Rails 中处理带有陈旧 CSRF 真实性 token 的页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10454440/

相关文章:

javascript - 为什么设置 action_controller.perform_caching = true 会破坏 javascript?

PHP没有在子域上保存 session ,在域上可以

asp.net-mvc - ASP.NET MVC3 AntiForgeryToken

django - Delphi IdHTTP 在 Django 创建的表单上发布

ruby-on-rails - 在这种情况下如何使用 Rails 助手 link_to RESTfully?

mysql - 更新后 Rails 无法正常工作

ruby-on-rails - 我无法安装回形针

php - 拉维尔 419 | session 过期

asp.net-mvc - 在 MVC 3+ 中写入只读 session

security - 了解CSRF