无法通过 Ajax 将表单发布到其他子域(警告:无法验证 CSRF 令牌的真实性)



我试图将远程表单从表单(domain.com)发送到另一个子域(example.domain.com),但我一直在日志中获得警告WARNING: Can't verify CSRF token authenticity,chrome中的检查器告诉我请求的状态为(canceled),类型为application/x-www-form-urlencoded

这是表格:button_to "Follow", follow_users_url(subdomain: post.user_username_slug), remote: true

当我去掉remote: true时,我得到了我想要的结果。此外,当一个用户尝试在操作的相同子域(example.domain.com)中使用相同的表单时,我得到了正确的结果。

我找到了一种在所有子域中共享cookie的方法(session_store.rb中的domain: :all),但我找不到在Ajax请求中共享令牌的方法。

我使用的是Rails 3.1.3、Ruby 1.9.3和jQuery 1.7.1。

有人能帮我吗?

编辑:

这个问题似乎与CORS有关。现在,我正试图找到一个最小摩擦的解决方案,使这个(异步)跨子域请求工作。

在POST参数中,包括字段"authenticity_token"和助手*form_authenticity_taken*返回的值。(这与饼干无关)。

编辑我认为您遇到了同源策略,该策略阻止域A中的javascript与域B通信(也适用于子域)。有一个名为CORS的"覆盖",与对话的域必须实现它。

因此,假设您同时控制域A和域B,您就可以绕过这个限制。这解释了为什么"正常"请求有效,而":remote=>true"请求无效。(CSRF令牌错误可能不准确。)下面是一篇关于在Rails中设置CORS的文章(在我的示例中是域B)。

您可以将两个控制器中的真实性令牌设置为相同的

我想是

protect_from_forger:secret=>'long_secret_string'

如果两个控制器使用相同的令牌,您应该能够跨子域或其他站点发布。通过

,您确实打开了一些跨站点脚本漏洞

相关内容

  • 没有找到相关文章

最新更新