如何在django的预先发出的CORS POST请求中处理CSRF?

时间:2013-11-13 08:31:28

标签: ajax django cors csrf

我正在尝试通过AJAX从POSTabc.com(这是一个Django应用程序)发出xyz.com请求。 我通过GETxyz.com上的网址发出OPTIONS请求来获取CSRF令牌,但在预检请求中向xyz.com发出OPTIONS请求时,令牌会更改。< / p>

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

注意:

我遵循以下来源的指示:

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

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

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