我有一个Django应用,该应用当前在Heroku上托管,具有大约十二个视图。当直接转到应用程序URL时,我可以对应用程序执行POST请求,并且启用了django.middleware.csrf.CsrfViewMiddleware。我正在运行Django 2.1
我目前遇到一个问题,我试图将此Django应用程序嵌入到我在Weebly托管的另一个网站上的iframe中。尝试在任何Django表单上张贴文章时,我总是收到403错误。原因是“未设置CSRF Cookie”。
我正在通过Ubuntu上的Chrome进行此操作。我检查了开发人员控制台中的“应用程序”选项卡,并确实看到在Heroku域的cookie中设置的csrftoken键值对。 Weebly域不包含csrftoken键值对。我认为它只会使用Heroku应用程序域中的cookie并使用csrftoken,但事实并非如此。
在Django中,这是我关于CSRF的设置:
CSRF_COOKIE_SECURE = False
CSRF_TRUSTED_ORIGINS = ['example123.herokuapp.com',
'app123.weebly.com']
我真的不想禁用安全性或使用csrf_exempt装饰器,因为这感觉像是黑客。我正在把头发拉出来!
编辑:
{%csrf_token%}处于表单中,我可以看到隐藏的字段“ csrfmiddlewaretoken”:
<input type="hidden" name="csrfmiddlewaretoken" value="XXXXXXXXXXXXXXXXXXXXXXywkFTfTC9ttYiOTD0O8uF49SvRjaUWgWeLU0h2PjP2">
答案 0 :(得分:0)
csrf在django中有两件事 1. Csrfmiddlewaretoken:{%csrf_token%} example of set-token header 2. CSRFcookie:我认为您没有做到这一点。 example of same request giving different csrf-token
这里显示的图像都是我的一个应用程序针对特定请求的示例
我们经常将第二个与第一个混淆。在第二种情况下,服务器在第一个get请求中使用csrf令牌设置cookie(这是cookie,而不是csrfmiddlewaretoken),需要每次发送一次以进行csrf cookie验证。这是由浏览器本身完成的,我们通常不会注意到。但是,使用CORS会出现问题(请求的不同来源,例如android / angular应用等)。