2011-12-13 90 views
2

我发送POST请求从IPhone到Django并获得“CSRF验证失败”,我不能完全理解。 我试图通过互联网找到一个好的解决方案,但我不能。 有没有简单的方式发布到Django?iPhone发布到Django并获得CSRF验证失败

这是我的代码:

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); 

回答

3

通常这归结为正确设置标头。已经有详细说明的an answer。你所需要的相关部分是这样的:

xhr.setRequestHeader("X-CSRFToken", token) 

见链接的答案的详细信息,从饼干获得令牌,为了简便起见我没有从那里复制它。我不太了解代码的上下文,因此这种检索方法可能不会直接应用。无论如何,你需要以某种方式获得令牌。

当您有令牌时,将标题添加到NSMutableURLRequest。发布请求后,错误应该消失。

[request addValue:token forHTTPHeaderField:@"X-CSRFToken"]; 
+0

我仍然不知道如何获得令牌 –

+0

好了,有了CSRF的想法令牌是服务器具有生成它们为你。这意味着如果没有首先收到令牌(通过GET),就无法进行POST。如果你想在没有GET的情况下做到这一点......这有点问题,因为它会使整个保护机制过时。你也许能够创建一个静态的令牌,但是当别人想出来的时候你会遇到问题。所以......我认为你需要确定如何(或更好,如果)你需要保护措施。 – jro

+0

那么如何通过GET接收令牌? –

8

我错了,或者它只是没有意义,使用本机应用程序?

在这种情况下,你可以使用这个装饰只是禁用此保护:

from django.views.decorators.csrf import csrf_exempt 
@csrf_exempt 
    def view_without_csrf_protection(request): 
    pass