使用 iframe 时 safari 中的 ActionController::InvalidAuthenticityToken 异常

发布于 2024-11-28 16:59:36 字数 123 浏览 1 评论 0原文

当我在 safari 中从 iframe 发布表单时,它给出了 Invalid Authenticity Token 异常。如果我尝试不使用 iframe,那么效果很好。

为什么会发生这种情况?我该如何解决这个问题?

While I posted a form from iframe in safari, it gives Invalid Authenticity Token exception. If I try without iframe, then it works fine.

Why it is happening? How can I fix this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

故事灯 2024-12-05 16:59:36

真实性令牌是 Rails 用于保护用户免受 CSRF 攻击的一种机制。这是一个很好的解释,取自了解 Rails 真实性令牌

当用户查看要创建、更新或销毁的表单时
一个资源,rails 应用程序将创建一个随机的authenticity_token,
将此令牌存储在会话中,并将其放置在
形式。当用户提交表单时,rails 会查找
authenticity_token,将其与会话中存储的进行比较,并且
如果它们匹配,则允许继续请求。

所以基本上,对于任何会修改模型的操作,rails 都希望验证它是否是由您发起的更改。

Rails 通过使用如下 html 标签将该秘密真实性令牌添加到表单中来实现这一点(通过使用 form_forform_tag 帮助程序):

回到你的问题:我从未使用过 iframe,所以我不确定发生了什么,但是我的猜测是您的 iframe 表单没有传递 authencity_token。如果是这种情况,解决方案很简单,只需添加一个像上面这样的隐藏输入,并使用 form_authenticity_token 方法来设置其值。

The authenticity token is a mechanism that rails uses to protect users from CSRF attacks. Here is a good explanation, taken from Understanding the Rails Authenticity Token

When the user views a form to create, update, or destroy
a resource, the rails app would create a random authenticity_token,
store this token in the session, and place it in a hidden field in the
form. When the user submits the form, rails would look for the
authenticity_token, compare it to the one stored in the session, and
if they match the request is allowed to continue.

So basically, for any action that would modify your model rails wants to verify that it is a change originated by you.

Rails does that (through the use of form_for or form_tag helpers) by adding that secret authenticity token to the form with a html tag like this: <input name="authenticity_token" type="hidden" value="Som3Thin10ngAndUGly">

Back to your problem: I've never worked with iframes so I'm not sure what's happening, but my guess is that your iframe form is not passing the authencity_token. If this is the case the solution is simple, just add a hidden input like the one above and use the form_authenticity_token method to set its value.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文