>我有一个简单的 Rails 6 应用程序,我在其中使用表单
<%= bootstrap_form_with(model: event, local: true, html: { multipart: true }) do |form| %>
在生成的 HTML 中,我有这个标题
<meta name="csrf-param" content="authenticity_token" />
<meta name="csrf-token" content="SOME TOKEN" />
并以形式
<input type="hidden" name="authenticity_token" value="SOME OTHER TOKEN" />
通常一切正常,但有时我会收到错误
Can't verify CSRF token authenticity.
日志显示令牌已在参数中传递,我无法找出验证失败的原因。我确信没有恶意使用或类似的东西。
CSRF代币失去有效性有什么原因吗?也许它只在一定时间内有效?
Rails 中的 CSRF 保护通过将随机值作为字段存储在正在提交的表单中以及用户会话中来工作。如果提交表单时的值不匹配,Rails 将拒绝表单提交请求。
如果您在 Rails 中使用默认的 cookie 会话存储,则 会话不会过期(直到 Cookie 过期(。如果您正在使用 其他内容(文件或数据库支持的会话(,那么是的,如果那些 会话过期,表单提交将失败并显示 CSRF 错误。
因此,如果您使用的是基于 Cookie 的会话(默认(,请检查 Cookie 到期时间。如果看起来没问题,那可能是其他问题。