gpt4 book ai didi

Django:CSRF Coo​​kie 未在 iframe 中设置——没有 csrf 豁免的解决方法

转载 作者:行者123 更新时间:2023-12-03 23:21:30 25 4
gpt4 key购买 nike

我的项目正在几个 3rd 方站点上部署 iframe,这些站点在 django 应用程序中都是已知和注册的。

在这些 iframe 中,用户可以触发一些 ajax-form 事件。直接打开网站,一切正常。如果我打开包含 iframe 的 3rd 方站点,django 在触发 ajax 事件(403)后会抛出错误,说 CSRF 失败。

在表单中,我使用了在 html 中设置的 {% csrf_token %}。但是在通过 iframe 调用站点时并没有设置相应的 cookie(发现两者都在浏览器中使用检查模式)。

我知道我可以使用装饰器 @csrf_exempt ,但这将同时禁用 csrf 保护,这是我不想做的。

所以我的问题是:

  • 当整个页面通过 iframe 加载时,为什么 django 不设置 CSRF Coo​​kie?
  • 是否可以让 django 设置 cookie 或者是否可以只从 csrf 中免除已知的 url?
  • 有没有我看不到的方法?

  • 非常感谢您的时间! :)

    最佳答案

    我正在处理同样的问题,Midas Gossye 的回答对我不起作用。我的解决方案是在 settings.py 中进行以下编辑当站点在 iframe 中时,让 Django 设置 CSRF cookie。

  • 套装CSRF_COOKIE_SAMESITE = None ,因为您希望 CSRF cookie 从您的站点发送到在 iframe 中包含它的站点 ( source )
  • 确保 Django 将 CSRF cookie 标记为安全,使用 CSRF_COOKIE_SECURE = True .这意味着浏览器将确保此 cookie 仅通过 HTTPS ( source ) 发送。您应该拥有它,因为它更安全,并且 future 版本的浏览器只会发送带有 SameSite=None 的 cookie,如果它也被标记为安全。
  • 您不需要设置 CSRF_TRUSTED_ORIGINS就像之前的答案之一所暗示的那样,实际上可以说出于安全原因您不应该这样做。这是因为如果用户通过 iframe 使用您的站点,POST 请求仍然来自您的站点,而不是来自其他服务器。仅当 POST 请求来自另一台服务器上的站点时才需要此设置 ( source )

  • 您可能需要清除 Django 站点上的 cookie(应包括 csrftoken cookie),然后重新加载并检查新的 csrftoken 是否标记为“安全”并且没有“SameSite”。
    现在,当第 3 方页面在 iframe 中包含您的页面时,应该设置 csrftoken cookie(您可以通过让您的页面使用 Javascript 打印 csrftoken cookie 来确认),并且您应该能够从您的页面发出成功的 POST 请求iframe-d Django 站点。

    关于Django:CSRF Coo​​kie 未在 iframe 中设置——没有 csrf 豁免的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53621161/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com