6

我在会话中使用 Rails 3.2.3 和 active_record_store。

我的理解是 Rails 中的 CSRF 令牌存储在会话中,除非调用 reset_session 或由于某种原因会话被破坏,否则不应重置。

但是在某些地方,当远程表单通过 ajax 加载时,它包含的真实性令牌与该页面上 META 标记中指定的真实性令牌不同。因此,在提交该表单时会导致无效令牌错误和 reset_session。

def form_authenticity_token
  session[:_csrf_token] ||= SecureRandom.base64(32)
end

我无法弄清楚为什么会话 [:_csrf_token] 被破坏并创建新令牌的有效会话?

4

1 回答 1

4

经过一番摸索,终于弄明白了这个问题。我将模型对象直接存储在会话中,即使使用了大小限制为 65KB 的活动记录会话存储,但会话在 4kb 后被截断,这导致 CRSF 令牌被擦除并生成了一个新令牌。是的!大错特错...永远不要在会话中存储模型对象,除非您有充分的理由不这样做。无论如何,仍然试图弄清楚为什么即使在有一个活动的记录会话存储之后我也无法在会话中存储更大的对象。

于 2012-11-21T01:45:10.500 回答