【问题标题】:Adding csrf_token to my post request from iPhone app从 iPhone 应用程序将 csrf_token 添加到我的发布请求中
【发布时间】:2013-12-09 18:48:15
【问题描述】:

我有一个 iPhone 应用程序,我想从该应用程序调用一个在其请求中传递参数的后期服务,这样做会导致服务器错误 500。

我已经阅读了 Django 文档 here,但我仍然没有弄清楚如何获得 csrf_token 以及如何将其添加到 AFNetworking AFHTTPRequestOperationManager POST 方法中。

在服务器端,我在MIDDLEWARE_CLASSES 部分添加了django.middleware.csrf.CsrfViewMiddleware,但它似乎不起作用。

我的观点是这样的;我没有做太多,只是希望通过。

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

【问题讨论】:

  • 你的
    标签中有{% csrf_token %}吗?
  • @TehTris 我没有任何模板,所以没有表单只有 urls.py models.py 和 views.py
  • 那么您尝试查看的视图定义是什么?据我所知{% csrf_token %} 在 HTML 渲染过程中的某处(如表单中)如果它对 csrf 令牌大喊大叫
  • @TehTris 我已经用视图更新了问题,我也明白令牌应该嵌入到请求中,这就是为什么我要问如何获得一个,以及如何添加它在 AFHTTPRequestOperationManager POST

标签: python iphone django django-csrf


【解决方案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
}

当然,如果你只做 POST 而不先 GET,你就没有 CSRF 令牌要发送!

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

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

【讨论】:

  • 正如我所提到的,我阅读了文档实现了这些步骤,但它没有工作我什至在我的问题中有一个指向它的链接:) 每个 get 返回一个不同的 csrf 还是在整个过程中都是相同的整个程序?
  • 我看到了文档链接,但我链接的关于 AJAX 的部分专门解释了 cookie 是如何设置的以及你需要用它做什么。注意关于调用 ensure_csrf_cookie() 的部分。 Django 在登录时设置令牌,我不相信在那之后的任何时候都会这样做。你是如何使用这些调用的?有 GET 请求,还是只是 POST 到 API?
  • 我没有使用 AJAX,这些只是我的 iPhone 应用程序的 API POST
猜你喜欢
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
  • 2021-08-08
  • 1970-01-01
  • 2017-03-09
  • 1970-01-01
相关资源
最近更新 更多