【问题标题】:CSRF token problem on requests from outside the browser to a Rails server从浏览器外部到 Rails 服务器的请求的 CSRF 令牌问题
【发布时间】:2011-09-07 07:59:29
【问题描述】:

我需要从浏览器外部发出 HTTP POST 请求,但 Rails 后端不接受身份验证(错误 401)。我知道在这种情况下我需要传递一个 CSRF 令牌,但它不起作用。

当我通过浏览器上的表单发出请求时,它按预期工作,但是当我尝试从浏览器外部(例如使用 curl)模拟相同的请求(在标头和 cookie 方面)时,身份验证不起作用。

两个小改动让我在没有浏览器的情况下成功:(1) 关闭 protect_from_forgery,它验证 CSRF 或 (2) 使用 GET 而不是 POST 请求。在这两种情况下,传递 cookie 就足够了。这意味着问题肯定与 CSRF 相关。

所以,我的问题是:如何在不使用浏览器的情况下将受 CSRF 保护的 HTTP POST 发送到 Rails 服务器?

为了澄清,该过程分为三个步骤:

  1. 登录:返回一个cookie来识别会话;

  2. GET 请求,返回 CSRF 令牌以供稍后使用(使用 cookie);

  3. 创建POST 请求,提交我想要创建的信息(使用会话 cookie 和 CSRF 令牌)。

唯一失败的是第三步。

【问题讨论】:

  • 如果您有其他形式的身份验证,例如 API 密钥,那么您可以在控制器上使用 skip_before_filter :verify_authenticity_token。仅当您有适当的身份验证方法或使用来自外部服务的网络挂钩时才使用此选项。

标签: ruby-on-rails http http-post csrf protect-from-forgery


【解决方案1】:

假设您的 CSRF 令牌是基于 cookie 的,那么您用来发出请求的程序需要跟踪 cookie。查看 curl 中的 --cookie-jar 选项。

【讨论】:

  • 谢谢你,@tylerl!我在第三步中使用了第 1 步返回的 cookie。保留第 2 步返回的 cookie 并在第 3 步中使用它解决了我的问题!第二个cookie的内容中并没有提到CSRF,但是看来既然会话改变了,应该使用正确的。
猜你喜欢
  • 2014-09-22
  • 1970-01-01
  • 2016-03-08
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
  • 2012-10-07
  • 2012-05-10
  • 2022-08-18
相关资源
最近更新 更多