2011-12-13 5 views
2

IPhone에서 Django로 POST 요청을 보내면 "CSRF 확인에 실패했습니다"라는 메시지가 나타납니다. 나는 인터넷을 통해 좋은 해결책을 찾으려고했지만 나는 할 수 없었다. django에 POST 할 수있는 간단한 방법이 있습니까?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 
관련 문제