我正在构建一个与服务器通信以获取数据的ios应用程序。
如果它只是一个普通的应用程序,我可以通过表单发送csrf令牌(因为所有来自同一个域)。但是,对于ios应用程序,我不认为我可以设置csrf令牌。
因此,当从ios应用程序向服务器发出请求时,我收到有关csrf的错误。那么,最新解决方案是什么?禁用此csrf功能或其他更好的方法?这是我的第一个ios应用程序,所以请告诉我一个更好的方法,所以我会遵循它。
答案 0 :(得分:12)
对于您的iOS应用访问的那些网址(“API端点”),您需要在相应的视图功能上指定@csrf_exempt
以禁用csrf保护。
此处有更多详情 https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#django.views.decorators.csrf.csrf_exempt
并通过其他身份验证方法保护这些网址,例如会话身份验证。
为了您的身份验证,您可以轻松参考django rest framework和django tastypie所做的事情。两者都使用SessionAuthentication类来处理身份验证并保护您的iOS应用程序可以连接的公开URL(API端点)。
<强>参考文献: - 强>
Django tastypie也有一个授权类,不要与身份验证混淆。它还有一个APIKey授权类,当你想要将你的django URL暴露给其他第三方开发人员时,它们可能想要构建他们自己的应用程序来与你的django URL通信以访问数据(想想“facebook APIs”) 。每个第三方开发人员实质上都可以提供一个唯一的API,因为您拥有APIKeyAuthorization类和为每个第三方应用程序提供的唯一API密钥,您可以确保只有“授权”的应用程序才能使用您的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令牌。
隐藏的表单字段,名称为“csrfmiddlewaretoken” 传出的POST表单。该字段的值是CSRF的值 cookie中。
这部分由模板标签完成。
对于所有未使用HTTP GET,HEAD,OPTIONS的传入请求 或TRACE,必须存在CSRF cookie,并且'csrfmiddlewaretoken' 字段必须存在且正确。如果不是,用户将得到一个 403错误。
此检查由CsrfViewMiddleware完成。
此外,对于HTTPS请求,严格的引用检查由 CsrfViewMiddleware。这对于解决中间人问题是必要的 使用独立会话时在HTTPS下可能发生的攻击 nonce,因为HTTP'Set-Cookie'标题是 (不幸的是)被正在与网站交谈的客户接受 HTTPS。 (没有为HTTP请求进行引用检查,因为 在HTTP下,Referer头的存在不够可靠。)
这确保了只有源自您网站的表单 可用于POST数据。