从浏览器外部向 Rails 服务器发出请求时出现 CSRF 令牌问题

发布于 2024-11-11 15:17:32 字数 748 浏览 1 评论 0原文

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

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

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

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

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

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

  2. :一个 GET 请求,返回稍后使用的 CSRF 令牌(使用 cookie);

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

唯一失败的是第三步。

I need to make an HTTP POST request from outside the browser, but the Rails back-end is not accepting the authentication (error 401). I know I need to pass a CSRF token in such cases, but it's not working.

When I make the request through a form on a browser, it works as expected, but when I try to simulate an identical request (in terms of headers and cookies) from outside the browser (using curl, for example), the authentication doesn't work.

Two small changes allowed me success without a browser: (1) turning off protect_from_forgery, which validates the CSRF or (2) using GET instead of POST for the request. In both cases, passing the cookie is enough. That means the problem is definitely related to CSRF stuff.

So, my question is: how can I make a CSRF-protected HTTP POST to a Rails server without using a browser?

To clarify, the process is broken in three steps:

  1. Login: returns a cookie to identify the session;

  2. New: a GET request that returns the CSRF token to be used later (uses the cookie);

  3. Create: a POST request that submits the information I want to create (uses both the session cookie and the CSRF token).

The only step which fails is the third one.

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

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

发布评论

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

评论(1

寒江雪… 2024-11-18 15:17:32

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

Assuming your CSRF token is cookie-based, then the program you use to make your requests needs to track cookies. Check out the --cookie-jar option in curl.

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