拥有POST'able API和Django的CSRF中间件

T. *_*one 32 security api django csrf

我有一个Django webapp,它既有前端的,可通过Web访问的组件,也有桌面客户端访问的API.但是,现在使用新的CSRF中间件组件,来自桌面客户端的POST请求的API请求将获得403.

我理解为什么会发生这种情况,但在不影响安全性的情况下解决这个问题的正确方法是什么?有没有我可以在HTTP标头中发出信号,它是一个API请求,Django不应该检查CSRF或者这是一个糟糕的策略?

编辑 -

我目前使用的方法是桌面客户端设置标头,X-Requested-With:XMLHttpRequest.这有点像hacky,但我不确定如何更好地处理它.

Bri*_*uft 10

如何分割桌面客户端的视图并使用csrf_exempt进行装饰?

  • 这正是设置,但`csrf_exempt`似乎没有什么区别.它仍然提供403与该装饰器.+1,因为根据文档,这应该是有效的,即使它不是. (6认同)
  • 只有在无法通过浏览器访问API时,此功能才有效.否则,这可能是非常危险的,因为请求可以从另一个站点伪造到API. (3认同)

Ada*_*nce 8

如果您使用的是基于类的视图,那么您将需要csrf_exempt调度方法而不是像这样的post方法:

@method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
    return super(MyView, self).dispatch(request, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

请参阅此错误凭单:https: //code.djangoproject.com/ticket/15794