iPhone POST 到 Django 并获得 CSRF 验证失败
Posted
技术标签:
【中文标题】iPhone POST 到 Django 并获得 CSRF 验证失败【英文标题】:iPhone POSTing to Django and gets CSRF verification failed 【发布时间】:2012-01-19 05:27:52 【问题描述】:我从 iPhone 向 Django 发送了一个 POST 请求并得到“CSRF 验证失败”,我无法完全理解。 我试图通过互联网找到一个好的解决方案,但我不能。 有什么简单的方法可以 POST 到 django 吗?
这是我的代码:
NSString *post =[NSString stringWithFormat:@"s=aaa&r=k&c=gg"];
NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:(@"http://localhost:8000/messages/views/")]];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];
NSError *error;
NSURLResponse *response;
NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSString *data=[[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding];
NSLog(data);
【问题讨论】:
【参考方案1】:我错了还是在本机应用程序上使用它没有意义?
在这种情况下,您可以使用此装饰器禁用此保护:
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def view_without_csrf_protection(request):
pass
【讨论】:
建议不要在视图上使用 CSRF 是一种可能导致安全问题的解决方法。这不是问题的解决方案【参考方案2】:通常这归结为正确设置标题。 an answer 已经详细说明了这一点。您需要的相关部分是:
xhr.setRequestHeader("X-CSRFToken", token)
有关从 cookie 获取令牌的详细信息,请参阅链接的答案,为简洁起见,我没有从那里复制它。我真的不知道您的代码的上下文,因此这种检索方法可能不会直接适用。无论如何,您需要以某种方式获取令牌。
获得令牌后,将标头添加到NSMutableURLRequest
。发布请求后,错误应该消失了。
[request addValue:token forHTTPHeaderField:@"X-CSRFToken"];
【讨论】:
我仍然不知道如何获得令牌 嗯,CSRF 令牌的想法是服务器必须为您生成它们。这意味着您不能在没有首先收到令牌(通过 GET)的情况下进行 POST。如果您想在没有 GET 的情况下执行此操作......这有点问题,因为它会使整个保护机制过时。您也许可以创建一个静态令牌,但是当其他人想出来时,您就会遇到问题。所以...我认为您需要确定如何(或更好,如果)您需要完成保护。 那么如何通过 GET 接收令牌? 请参阅Django docs。主要是,您将视图渲染到模板。在该模板中,使用% csrf_token %
标记。在您的 GET 中收到该页面后,提取令牌并在您的 POST 中重复使用它。以上是关于iPhone POST 到 Django 并获得 CSRF 验证失败的主要内容,如果未能解决你的问题,请参考以下文章
Django 为 post.request 获得正确的返回值
iPhone- 在 POST 中将 JSON 对象发送到 PHP 服务器并从服务器获取响应
从 AngularJS POST 到 Django API 以获取 JWT 并返回 405 错误