2011-10-12 39 views
21

我注意到,如果您发布无效的CSRF令牌,rails/devise会自动将您注销。Rails CSRF令牌 - 它们是否过期?

我有一个应用程序不刷新页面,用户长时间坐在实时页面上。时不时的用户被踢出去。我想知道CSRF令牌是否过期,使其无效。

这就是为什么我试图学习,Rails CSRF令牌是否过期?有没有时间设置在某个地方? Rails中

感谢

+0

你能描述空闲一段时间后用户正在做什么(状态更新的HTTP POST,获取新数据等)。 – Nick

回答

24

CSRF保护的工作原理是作为形式的现场提交,以及在用户会话中存储一个随机值。如果在提交表单时这些值不匹配,Rails会拒绝表单提交请求。

如果您在Rails中使用默认的Cookie会话存储,那么会话将不会过期(直到cookie发生)。如果您使用的是其他文件(支持文件或数据库的会话),那么是的,如果这些会话过期,则表单提交将失败并显示CSRF错误。

因此,如果您使用基于Cookie的会话(默认),请检查cookie过期时间。如果这看起来不错,这可能是其他一些问题。

+0

你没有提到csrf cookie的过期时间。它是一个会话cookie吗? – Ethan

+0

它存储在会话中,是的。只有在会话cookie中,如果你没有使用ActiveRecord支持的会话。 – Lambart

+0

这个答案确实帮助我理解了一些概念并解决了我们发现的一个错误。谢谢!无论如何,我真的很想明白为什么cookie需要?如果rails给你一个authenticiy_token并且你用同样的标记提交表单,为什么需要cookie?我试图在清除缓存后提交表单,并且我得到了'ActionController :: InvalidAuthenticityToken'。表单上的令牌是否存储在会话中,并且当表单get被提交时它会同时发送cookie和表单并验证两个令牌?谢谢。 –