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

时间:2010-03-08 22:41:25

标签: django security api csrf

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

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

编辑 -

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

3 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:7)

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

@method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
    return super(MyView, self).dispatch(request, *args, **kwargs)

查看此错误提示: https://code.djangoproject.com/ticket/15794

答案 2 :(得分:-3)

自Django 1.1起,CSRF代码将自动允许AJAX请求通过,因为浏览器似乎进行了适当的安全检查。这是original commitdocumentation