err*_*ona 3 django iframe csrf
我的项目正在几个 3rd 方站点上部署 iframe,这些站点在 django 应用程序中都是已知和注册的。
在这些 iframe 中,用户可以触发一些 ajax-form 事件。直接打开网站,一切正常。如果我打开包含 iframe 的 3rd 方站点,django 在触发 ajax 事件(403)后会抛出错误,说 CSRF 失败。
在表单中,我使用了在 html 中设置的 {% csrf_token %}。但是在通过 iframe 调用站点时并没有设置相应的 cookie(发现两者都在浏览器中使用检查模式)。
我知道我可以使用装饰器@csrf_exempt,但这会同时禁用 csrf 保护,这是我不想做的。
所以我的问题是:
非常感谢您的时间!:)
我正在处理同样的问题,Midas Gossye 的回答对我不起作用。我的解决方案是settings.py在站点位于 iframe 中时,进行以下编辑以使 Django 设置 CSRF cookie。
CSRF_COOKIE_SAMESITE = None,因为您希望 CSRF cookie 从您的站点发送到在 iframe 中包含它的站点(源)CSRF_COOKIE_SECURE = True. 这意味着浏览器将确保此 cookie 仅通过 HTTPS 发送(源)。您应该拥有它,因为它更安全,并且未来版本的浏览器只会发送带有 SameSite=None 的 cookie,如果它也被标记为安全。CSRF_TRUSTED_ORIGINS像以前的答案之一所建议的那样设置,事实上,出于安全原因,您不应该这样做。这是因为如果用户通过 iframe 使用您的站点,POST 请求仍然来自您的站点,而不是来自其他服务器。仅当 POST 请求来自另一台服务器上的站点时才需要此设置(源)您可能需要清除 Django 站点上的 cookie(应包括 csrftoken cookie),然后重新加载并检查新的 csrftoken 是否标记为“安全”并且没有“SameSite”。
现在,当第 3 方页面在 iframe 中包含您的页面时,应该设置 csrftoken cookie(您可以通过让您的页面使用 Javascript 打印csrftokencookie来确认),并且您应该能够从 iframe-d 发出成功的 POST 请求姜戈网站。
小智 5
This is what I changed in my settings.py file to get something similar working:
X_FRAME_OPTIONS = 'ALLOW-FROM example.com'
CSRF_TRUSTED_ORIGINS = ['example.com']
CSRF_COOKIE_SAMESITE = None
Run Code Online (Sandbox Code Playgroud)
Where example.com is the domain that you insert the iframe into. The last option was only introduced quite recently in Django, so depending on your version it might not be necessary.