gpt4 book ai didi

django - 对 Varnish 缓存的 View 使用 Django 的 CSRF 保护

转载 作者:行者123 更新时间:2023-12-01 09:39:15 25 4
gpt4 key购买 nike

我有一个使用 CSRF 保护的表单的 Django View 。我希望这个 View 在有正常 GET 请求时被 Varnish 缓存(因为所有用户都需要相同的表单,无需登录)。

所以有两个挑战:

  • 如何在 Varnish 中缓存此页面,而不将缓存/旧版本的 csrf 隐藏字段交付给用户?是否可以缓存带有 CSRF 字段的页面?
  • 默认情况下,我的 Varnish 会去除所有 cookie,我如何轻松地使其去除所有 cookie,但 csrftoken cookie 除外?我是否必须设置特定的 CSRF_COOKIE_DOMAIN?
  • 最佳答案

    这已经晚了几年,但这是我最近解决这个问题的方法。

    诀窍是使用 Varnish 支持的 ESI 。我们获取 CSRF 片段并将其粘贴到自己的页面中,在通过 varnish 时通过 ESI 将其包含在内,否则直接(例如在运行本地开发服务器时)。

    csrf_esi.html:

    {% csrf_token %}

    csrf_token.html
    {% if request.META.HTTP_X_VARNISH_USE_CACHE %}
    <esi:include src="{% url 'esi_csrf_token' %}" />
    {% else %}
    {% include "csrf_esi.html" %}
    {% endif %}

    网址.py
    from django.conf.urls import url
    from django.views.generic import TemplateView

    urlpatterns = [
    ...
    url(r'csrf_esi.html', TemplateView.as_view(template_name="csrf_esi.html"), name='esi_csrf_token'),
    ]

    csrf_esi.py
    from django import template

    register = template.Library()

    @register.inclusion_tag('csrf_token.html', takes_context=True)
    def csrf_token_esi(context):
    return context

    设置.py
    TEMPLATES = [
    {
    ...
    'OPTIONS': {
    ...
    'builtins': [
    'path.to.csrf_esi',
    ],
    }
    }
    ]

    Varnish 配置
    set req.http.X-Varnish-Use-Cache = true;

    您还需要将 csrf_esi.html 页面列入白名单,使其永远不会被缓存,并在 set beresp.do_esi = true; 函数中添加 vcl_fetch。我会详细说明这一点,但我没有设置系统的这一部分,我自己也不是 100% 清楚。

    现在你可以像使用普通的 {% csrf_token %} 标签一样简单地使用它:
    <form action="">
    {% csrf_token_esi %}
    <button type="submit">Push me</button>
    </form>

    设置起来有点麻烦,但是一旦完成,您将永远不必再看一遍。

    关于django - 对 Varnish 缓存的 View 使用 Django 的 CSRF 保护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6291964/

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