11

I am building an ios app that communicates with the server for getting the data.

If its just a normal app, I can send csrf token via forms (since all from same domain). But, for ios apps, I dont think I can set csrf token .

So, when making requests from ios apps, to the server, I am getting error regarding csrf. So, whats the solution for this? Disabling this csrf feature or some other better way ? This is my first ios app, so please tell me a better way so i will follow that.

4

1 回答 1

13

对于您的 iOS 应用程序正在访问的那些 URL(“API 端点”),您需要@csrf_exempt在相应的视图函数上指定以禁用 csrf 保护。

更多详细信息 - https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#django.views.decorators.csrf.csrf_exempt

并通过其他身份验证方法保护这些 url,例如会话身份验证。

出于您的身份验证目的,您可以轻松参考 django rest 框架和 django sweetpie 所做的事情。两者都使用 SessionAuthentication 类来处理身份验证并保护您的 iOS 应用程序可以连接到的公开 url(API 端点)。

参考:-

Django sweetpie 还有一个授权类,不要与身份验证混淆。它还有一个 APIKey 授权类,当您确实想将您的 django URL 公开给可能想要构建自己的应用程序以与您的 django URL 对话以访问数据的其他 3rd 方开发人员时,它会变得很有用(想想“facebook API”) . 每个 3rd 方开发人员本质上都可以被提供一个唯一的 API,并且因为您拥有 APIKeyAuthorization 类和为每个 3rd 方应用程序提供的唯一 API Key,您可以确保只有“授权”应用程序可以使用您的 django URL。这就是“Google+”或“Facebook”等各种大平台如何运作的本质。

django 的 csrf 工作原理的详细信息

https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#how-it-works

CSRF 保护基于以下几点:

设置为随机值的 CSRF cookie(与会话无关的 nonce,因为它被称为),其他站点将无法访问。

此 cookie 由 CsrfViewMiddleware 设置。它是永久的,但由于无法设置永不过期的 cookie,它会与调用 django.middleware.csrf.get_token() 的每个响应一起发送(内部用于检索 CSRF 令牌的函数) .

所有传出的 POST 表单中都存在一个名为“csrfmiddlewaretoken”的隐藏表单字段。该字段的值是 CSRF cookie 的值。

这部分由模板标签完成。

对于所有未使用 HTTP GET、HEAD、OPTIONS 或 TRACE 的传入请求,必须存在 CSRF cookie,并且“csrfmiddlewaretoken”字段必须存在且正确。如果不是,用户将收到 403 错误。

此检查由 CsrfViewMiddleware 完成。

此外,对于 HTTPS 请求,严格的 referer 检查由 CsrfViewMiddleware 完成。这是解决在 HTTPS 下使用与会话无关的 nonce 时可能发生的中间人攻击所必需的,因为 HTTP 'Set-Cookie' 标头(不幸地)被正在与HTTPS 下的站点。(对 HTTP 请求不进行引用检查,因为在 HTTP 下引用头的存在不够可靠。)

这可确保只有源自您网站的表单才能用于 POST 回数据。

于 2013-05-04T06:34:04.457 回答