9

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

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

笔记:

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

4

2 回答 2

5

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 等基本的东西伪造。

于 2014-08-08T11:35:15.960 回答
2

django-cors-headers,您可能会发现它更适合解决您的问题:

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

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

于 2014-02-25T01:23:36.450 回答