如何在 django 中预检的 CORS POST 请求中处理 CSRF



我正在尝试通过AJAX从abc.com POST请求从xyz.com(这是一个Django应用程序)到URL。我通过向 xyz.com 上的 URL 发出GET请求来获取 CSRF 令牌,但是当在预检请求中发出OPTIONS请求以xyz.com时,令牌会发生变化。

有没有办法在预检请求中获取OPTIONS请求的响应?

注意:

我正在遵循以下来源的说明:

  • https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest
  • https://developer.mozilla.org/en/docs/HTTP/Access_control_CORS
  • http://www.html5rocks.com/en/tutorials/cors/

Django CSRF 保护将允许 OPTIONS 请求,所以第一阶段没有问题:

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

如果我理解正确,那么您希望允许下一个请求(例如跨域 POST)通过。为了解决这个问题并通过Django的CSRF保护,请求必须发送一个CSRF令牌(在POST数据或AJAX的标头中)和一个匹配的CSRF cookie。

现在,跨域限制使 abc.com 无法设置或读取 xyz.com cookie,无论是从javascript还是从服务器端响应。因此,这种方法是不可能的。

相反,您必须将@csrf_exempt应用于视图。这将允许任何网站发布到它。因此,您需要为视图构建一些其他保护。当然,您自己检查您的保护安全性。请记住,"Referer"和"Origin"标头可以很容易地用像curl这样基本的东西来伪造。

请参阅django-cors-headers,您可能会发现它的工作方式更适合解决您的问题:

https://github.com/ottoyiu/django-cors-headers/

Django-rest-framework推荐 http://www.django-rest-framework.org/topics/ajax-csrf-cors

最新更新