32

我有一个 Django webapp,它既有前端的、可通过网络访问的组件,也有一个可由桌面客户端访问的 API。然而,现在有了新的 CSRF 中间件组件,来自桌面客户端的经过 POST 的 API 请求会得到 403。

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

编辑 -

我目前使用的方法是桌面客户端设置一个标头,X-Requested-With: XMLHttpRequest。这有点骇人听闻,但我不确定如何更好地处理。

4

3 回答 3

10

为您的桌面客户端拆分视图并用csrf_exempt装饰它们怎么样?

于 2010-03-09T00:20:14.213 回答
8

如果您使用的是基于类的视图,那么您将需要 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

于 2013-01-17T12:25:28.793 回答
-3

从 Django 1.1 开始,CSRF 代码将自动允许 AJAX 请求通过,因为浏览器似乎进行了适当的安全检查。这是原始提交文档

于 2010-09-06T15:06:16.630 回答