如何在 iOS 中获取 CSRF 令牌?

Posted

技术标签:

【中文标题】如何在 iOS 中获取 CSRF 令牌?【英文标题】:How to get CSRF token in iOS? 【发布时间】:2012-12-27 05:00:32 【问题描述】:

所以我试图将表单数据发布到我同事的网站,以便从我的 iPhone 应用程序登录(简单的用户名和密码)。但是,看来我需要一个 CSRF 令牌才能发布。我已经对此进行了大量研究,并从我可以使用 GET 请求从csrftoken cookie(我在这里读到:https://docs.djangoproject.com/en/dev/ref/contrib/csrf/)获得这个令牌。问题是,我不知道如何处理这个 GET 请求?我从哪里得到?

这是到目前为止我的帖子请求的代码:

NSURL *url = [NSURL URLWithString:SERVER_ADDRESS];
NSData* postData= //Some form data
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request setValue:[NSString stringWithFormat:@"%d", postData.length] forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];

[request addValue:token forHTTPHeaderField:@"X-CSRFToken"];  //Where do I get this token from

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request
                                                              delegate:self];
[connection start];

我知道 *** 上有很多与此类似的帖子,但我没有找到任何似乎完整的答案。通常它只是将我引导到上面的链接,该链接仅填充了 AJAX 相关信息。非常感谢您的帮助!

【问题讨论】:

csrf 令牌在 cookie 中,默认情况下 csrftoken 将在同一会话中为同一视图接收。在发布之前,您需要再次请求才能获取此 cookie。 你找到解决这个问题的方法了吗? 您好友网站上的任何表单都应该在表单中包含令牌。您可以从网站上的任何形式解析 html。否则,请他在网站上创建一个仅显示 csrf 令牌的页面。 【参考方案1】:

正如 cmets 中所指出的,您可以从您朋友网站上包含表单的任何页面解析它。

如果您想要一个自己的,请他在/ios/ 呈现此模板

ios.html:

% csrftoken %

然后启动GET request:2 您可以使用正则表达式解析令牌的值:

NSString *regex = @"csrfmiddlewaretoken\".*?\"\(.*?\)\"";

最后,您必须在以下 HTTP POST 请求中设置 X-CSRFToken 的值。

【讨论】:

拿饼干怎么样?【参考方案2】:

为了使用令牌登录(POST),当然你必须先获得 CSRF 令牌,就像你说的那样。如果您首先对登录页面进行 GET 调用(在您跟进 POST 之前),登录页面的结果将返回一个 csrf_token 如果您使用浏览器(打开开发人员工具窗格),您可以看到它,然后查看在响应内容下的网络窗格中查看服务器设置的 csrftoken cookie。就我而言:

Set-Cookie:csrftoken=PgQEgY3LAynbVeWRIzXoo2VFRLfd8Uqt; expires=Fri, 10-Nov-2017 18:59:54 GMT; Max-Age=31449600; Path=/; secure

从响应中解析出来后,设置一个像这样的标题:

X-CSRFToken: "PgQEgY3LAynbVeWRIzXoo2VFRLfd8Uqt" 

在您的 POST 中使用登录名/密码信息。高温

【讨论】:

以上是关于如何在 iOS 中获取 CSRF 令牌?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Django 在前端获取 CSRF 令牌以及如何在 Postman 中使用它

如何在 javaScript 中获取 CSRF 令牌值

如何在 Jmeter 中获取用于登录的 csrf 令牌

如何在暴力模式下使用 OWASP ZAP 在授权请求中获取 CSRF 令牌

如何使用 Spring Boot 在 html 元标记中获取 csrf 令牌

在测试中获取 CSRF 令牌