【发布时间】:2011-10-23 21:04:52
【问题描述】:
虽然我在 safari 中从 iframe 发布了一个表单,但它给出了 Invalid Authenticity Token 异常。如果我尝试不使用 iframe,那么它可以正常工作。
为什么会这样?我该如何解决这个问题?
【问题讨论】:
标签: ruby-on-rails-3 cookies safari cross-domain p3p
虽然我在 safari 中从 iframe 发布了一个表单,但它给出了 Invalid Authenticity Token 异常。如果我尝试不使用 iframe,那么它可以正常工作。
为什么会这样?我该如何解决这个问题?
【问题讨论】:
标签: ruby-on-rails-3 cookies safari cross-domain p3p
真实性令牌是 Rails 用来保护用户免受 CSRF 攻击的一种机制。这是一个很好的解释,取自Understanding the Rails Authenticity Token
当用户查看要创建、更新或销毁的表单时 一个资源,rails 应用程序会创建一个随机的authentity_token, 将此令牌存储在会话中,并将其放置在 形式。当用户提交表单时,rails 会查找 authentity_token,将其与存储在会话中的进行比较,然后 如果它们匹配,则允许请求继续。
因此,基本上,对于任何会修改您的模型导轨的操作,都希望验证它是由您发起的更改。
Rails 做到这一点(通过使用 form_for 或 form_tag 助手)通过将秘密真实性令牌添加到具有如下 html 标签的表单中:<input name="authenticity_token" type="hidden" value="Som3Thin10ngAndUGly">
回到你的问题:我从来没有使用过 iframe,所以我不确定发生了什么,但我猜你的 iframe 表单没有通过 authencity_token。如果是这种情况,解决方案很简单,只需像上面那样添加一个隐藏输入,然后使用form_authenticity_token 方法设置其值。
【讨论】: