我正在尝试通过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