【问题标题】:Django csrf cookie not set for sub domain when accessed in iframe on third party site在第三方站点的 iframe 中访问时,未为子域设置 Django csrf cookie
【发布时间】:2015-09-02 05:55:52
【问题描述】:

到目前为止,我的应用运行良好,一切都通过访问其公共 IP 完成。

现在,它被添加到主站点 app.mainsite.com。 可以这样访问。我可以登录等等。

但我的应用有点特别,它的某个功能允许其用户在应用脚本嵌入 html 的任何第三方网站上的 iframe 中打开其中一个 URL,以执行一些特定于应用的活动在那些第三方网站上。现在,每个人都可以看到该应用程序为这些第三方网站带来的新内容,但要更改一些设置如何,必须登录到我的应用程序。如果没有,则会在模态本身内部重定向,如果登录成功,它们将被重定向到设置编辑页面。基本上,来自第三方网站的任何写入请求都需要网站所有者登录到我们的应用程序。他们可以在模态框内登录,或者从另一个选项卡登录,然后刷新他们的网站以进入编辑视图。

问题是,早些时候,这一切都完美无缺。 现在,我可以使用来自 app.mainsite.com 的 csrf 令牌进行表单发布,但是当它在 iframe 中打开时,它会抛出 CSRF cookie not set

我检查了“资源”选项卡,在该选项卡下,app.mainsite.com 中的 csrftoken 与表单中的 csrfmiddlewaretoken 不匹配。 显然,CSRF 失败了。

我该如何克服这个问题?

我尝试设置CSRF_COOKIE_DOMAIN='.mainsite.com',但没有成功。

我能做什么?

【问题讨论】:

  • 我了解您的问题,但如果不调查您的应用程序的工作原理,我不确定能否提供帮助。我不必处理来自嵌入到第三方站点的 iframe 中的 POST 请求,但它似乎应该可以正常工作。我将首先通过CsrfViewMiddleware 并调查它到底在哪里失败:github.com/django/django/blob/master/django/middleware/… 另外'.mainsite.com' 设置适用于所有子域,您应该将其设置为:CSRF_COOKIE_DOMAIN='app.mainsite.com'

标签: django cookies cross-domain django-csrf cross-site


【解决方案1】:

您可以尝试在提供响应的视图周围添加 @csrf_exempt 装饰器...但是当然,这将禁用 CSRF 验证...

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def your_view(request):
    ...

【讨论】:

  • 我正在检查用户是否登录。如果没有,他/她将被重定向到登录页面。那不是 csrf 豁免。我确实尝试过,但没有奏效。我必须免除 django 登录表单视图,但我不能这样做。
  • hmm...好吧,您可以完全禁用整个站点的CSRF验证...根据文档,不推荐但可以这样做...(docs.djangoproject.com/en/dev/ref/csrf)只需删除' django.middleware.csrf.CsrfViewMiddleware' 来自设置中的 MIDDLEWARE_CLASSES
  • 恕我直言,csrf 豁免是一种黑客行为,而不是这个问题的答案。正如作者所说,它正在处理公共 ip,但不在子域上,问题是别的。
【解决方案2】:

Turned out, it was a bug in the Ubuntu build of Chromium. 是的,我使用的是 Chromium(并且我使用 Ubuntu 作为我的操作系统)那个人在问题中提供的 plnkr 链接,它在 Chromium 中不起作用。但它在 Chrome 和 Firefox 中运行良好

在 Chrome 和 Firefox 中也测试了我的应用程序;和以前一样工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-04
    • 2021-06-10
    • 2020-12-18
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多