将csrf_token添加到我的iPhone应用程序的发布请求中

时间:2013-12-09 18:48:16

标签: python iphone django django-csrf

我有一个iPhone应用程序,我希望在其请求中调用post服务传递参数,这样做会导致服务器错误500.

我已阅读Django文档here,但我仍未弄清楚如何获取csrf_token以及如何将其添加到AFNetworking AFHTTPRequestOperationManager POST方法。

在服务器端,我在django.middleware.csrf.CsrfViewMiddleware部分添加了MIDDLEWARE_CLASSES,但似乎并没有这样做。

我的观点看起来像这样;我做得不多,只是希望通过。

from django.core.context_processors import csrf
from django.shortcuts import render_to_response

def foo(request):
   c={}
   c.update(csrf(request))
   if request.method == 'POST':
        return HttpResponseRedirect("Post received");

1 个答案:

答案 0 :(得分:1)

Django CSRF中间件使用cookie和表单以及将代码发送到页面的内容,然后确保正确的页面是发回信息的页面。在这两种情况下,您都必须向服务器发出GET请求,如果您正确安装了中间件,它会将CSRF令牌放入cookie中。

查看the documentation了解更多相关信息。

现在,我注意到你正在使用一个使用NSURLConnection的库,因此应该为你处理cookie。我得到了这个代码包(未经测试),可以让你拉出你在设置文件中指定的cookie名称(再次查看上面的文档链接),然后把它放在你的POST中。

NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL: networkServerAddress];
for (NSHTTPCookie *cookie in cookies) 
{
    // get the right cookie
}

当然,如果你只是发帖子而且从不GET,你没有要发送的CSRF令牌!

这就是我们拥有@csrf_exempt标签的原因。 (Docs here)这是99%的时间,因为大多数应用程序在执行POST之前不会执行GET。 (在网页中,你必须先进行GET)。请注意,这仅适用于应用程序仅发送POST并且没有会话要说的情况。在使用它时,您确实需要考虑自己的安全性,以及如何验证给定的应用程序/用户确实是他们声称的人。以及如何禁止人们从Web浏览器中访问此URL。

TLDR :可能在视图上使用@csrf_exempt,但要小心。