如何在jinja2模板引擎中保护csrf_token?

发布于 2024-12-11 09:14:54 字数 383 浏览 0 评论 0原文

在 Django 模板中,我使用:

<form action="/user" method="post">{% csrf_token %}
    {{ form.as_p|safe }}
    <input type="submit" value="Submit" />
</form>

但是当我更改为 jinja2 模板引擎时出错:

 Encountered unknown tag 'csrf_token'

我的问题: jinja2 中需要 csrf_token 保护 吗?

如果需要的话,该怎么做呢?

提前致谢!

In Django template I used:

<form action="/user" method="post">{% csrf_token %}
    {{ form.as_p|safe }}
    <input type="submit" value="Submit" />
</form>

But error when I change to jinja2 template engine:

 Encountered unknown tag 'csrf_token'

My question: csrf_token protection in jinja2 is required?

If required, how to do this?

Thanks in advance!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

猥琐帝 2024-12-18 09:14:54

是的,您仍然想使用跨站请求伪造保护,但是 Jinja2工作原理略有不同。

而不是默认的 Django 模板语言字符串:

{% csrf_token %}

您可以将其替换为 Jinja2,它具有与输出完整隐藏 HTML 输入元素相同的行为:

{{ csrf_input }}

您还可以单独使用 {{ csrf_token }} Jinja2 模板仅获取 CSRF 令牌本身并手动创建您自己的表单字段,例如:

<input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}">

原始帖子

文档

Yes, you still want to use Cross Site Request Forgery protection, but Jinja2 works a little differently.

Instead of this default Django Template Language string:

{% csrf_token %}

You can replace it with this for Jinja2 which has the same behavior of outputting the full hidden HTML input element:

{{ csrf_input }}

You can also use {{ csrf_token }} by itself in a Jinja2 template to get just the CSRF token itself and manually create your own form field like:

<input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}">

original post

docs

夕嗳→ 2024-12-18 09:14:54

我知道这是一个老问题,但我想在使用新的 django.template.backends.jinja2.Jinja2 时以正确的方式更新它以支持 csrf_token在 Django 1.8+ 中。使用 django 模板后端,您将调用 {% csrf_token %},但使用 Jinja2 后端,您将使用 {{ csrf_input }} 调用它(您可以获得令牌值而不是使用 {{ csrf_token }} 输入的令牌)。

您可以在 django.template.backends.jinja2.Jinja2 来源

I know this is an old question, but I wanted to update it with the proper way to support the csrf_token when using the new django.template.backends.jinja2.Jinja2 available in Django 1.8+. Using the django template backend you would have called {% csrf_token %}, but using the Jinja2 backend you will call it using {{ csrf_input }} (you can get just the token value instead of the token input using {{ csrf_token }}).

You can see the details in the django.template.backends.jinja2.Jinja2 source

看轻我的陪伴 2024-12-18 09:14:54

在带有 jinja2 模板引擎的 django 2.x 中,您可以使用 {{ csrf_token }} 获取令牌的值,并使用 {{ csrf_input }}

源获取完整的隐藏输入标记: https://django.readthedocs.io/en/2.1.x/ref/csrf.html

示例:

<form action="..." method="post">
  {{ csrf_input }}

   ...
</form>

in django 2.x with jinja2 templates engine you get the value of the token with {{ csrf_token }} and the complete hidden input tag with {{ csrf_input }}

source: https://django.readthedocs.io/en/2.1.x/ref/csrf.html

example:

<form action="..." method="post">
  {{ csrf_input }}

   ...
</form>
狼性发作 2024-12-18 09:14:54

我使用 Coffin
使用时遇到同样的问题:

from coffin.shortcuts import render_to_response
return render_to_response('template_name_here.html', context)

尝试改用:

from coffin.shortcuts import render
return render(request, 'template_name_here.html', context)

I use Coffin.
And have same problem when use:

from coffin.shortcuts import render_to_response
return render_to_response('template_name_here.html', context)

try to use instead:

from coffin.shortcuts import render
return render(request, 'template_name_here.html', context)
把梦留给海 2024-12-18 09:14:54

你不需要再做任何特别的事情了。 csrf_token 在 django-jinja 中受支持并且开箱即用。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8"/>
    <title>test</title>
  </head>
  <body>
    <p>This should add a hidden input tag with the token. use it in your forms</p>
    {% csrf_token %}
  </body>
</html>

You don't need to do anything special anymore. csrf_token is supported in django-jinja and works out of the box.

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8"/>
    <title>test</title>
  </head>
  <body>
    <p>This should add a hidden input tag with the token. use it in your forms</p>
    {% csrf_token %}
  </body>
</html>
同展鸳鸯锦 2024-12-18 09:14:54

这段 JS 代码可以解决这个问题,它适用于 Django 和 Jinja2
因为它是纯javaScript处理post方法表单标签,你可以通过探索它来定制它朋友

我只是从已经存在的cookie中获取CSRF令牌并在表单标签中使用它

let getCookie = (name) => {
    var cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = cookies[i].trim();
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}


$(()=>{
    formTags = document.querySelectorAll('[method="POST"]')
    
    let csrfToken = getCookie('csrftoken')

    

    Array.from(formTags).forEach(formTag=>{

        var inputTag = document.createElement('input')

        inputTag.setAttribute('type', 'hidden')
        inputTag.setAttribute('name', 'csrfmiddlewaretoken')
        inputTag.setAttribute('value', [csrfToken])
    
        formTag.appendChild(inputTag)

    })
})

This peace of JS code can fix this, it will work for both Django and Jinja2,
because it is pure javaScript handling for post method form tags, you can customize it by explore it friends

I'm just getting the CSRF token from cookies which already always exist and use it in form tags

let getCookie = (name) => {
    var cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = cookies[i].trim();
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}


$(()=>{
    formTags = document.querySelectorAll('[method="POST"]')
    
    let csrfToken = getCookie('csrftoken')

    

    Array.from(formTags).forEach(formTag=>{

        var inputTag = document.createElement('input')

        inputTag.setAttribute('type', 'hidden')
        inputTag.setAttribute('name', 'csrfmiddlewaretoken')
        inputTag.setAttribute('value', [csrfToken])
    
        formTag.appendChild(inputTag)

    })
})
骷髅 2024-12-18 09:14:54

我遇到了同样的问题,我注意到 CSRF 上下文处理器不在默认加载的处理器列表中。将 'django.core.context_processors.csrf' 添加到 setting.py 中的 TEMPLATE_CONTEXT_PROCESSORS 后,我可以使用 {% csrf_token % } 模板标签通常。

I had the same problem, and what I noticed is that the CSRF context processor isn't in the list of the default loaded processors. After adding 'django.core.context_processors.csrf' to the TEMPLATE_CONTEXT_PROCESSORS in setting.py I could use the {% csrf_token %} template tag normally.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文