CSRF 令牌丢失或不正确

Posted

技术标签:

【中文标题】CSRF 令牌丢失或不正确【英文标题】:CSRF Token missing or incorrect 【发布时间】:2011-12-26 17:10:50 【问题描述】:

这里是 Django 的初学者,我已经尝试解决这个问题很长时间了。 我的中间件类中确实有“django.middleware.csrf.CsrfViewMiddleware”,并且我的帖子表单中确实有令牌。

这是我的代码,我做错了什么?

from django.contrib.auth.forms import UserCreationForm
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect
from chartsey.authentication.forms import RegistrationForm
from django.template import RequestContext
from django.core.context_processors import csrf

def register(request):

    if request.method == 'POST':
        c = RequestContext(request.POST, )
        form = RegistrationForm(c)
        if form.is_valid():
            new_user = form.save()
            return HttpResponseRedirect("/")
    else:
        form = RegistrationForm()

    return render_to_response("register.html",  'form': form,  , )

这是我的模板:

% block content %

    <h1>Register</h1>
    <form action="" method="POST"> % csrf_token %
         form.as_p 
    <input type="submit" value="Submit">
    </form>

% endblock %

【问题讨论】:

Django: CSRF token missing or incorrect 的可能重复项 这篇文章解决了我的问题:***.com/a/20895547/14690597 这篇文章解决了我的问题:***.com/a/20895547/14690597 【参考方案1】:

DJANGO/AJAX 工作流程完整方法在这里 :)

const url = "% url 'YOUR_URL_NAME' pk=12345 %".replace(/12345/, id.toString());
$.ajax(
        type: 'POST',
        url: url,
        data: 'id':id, "csrfmiddlewaretoken": 'csrf_token',
        beforeSend: function()  $('#response').text('Please wait ...'); ,
        success: function (response) 
            console.log(response)           
        ,
        error: function (response) 
            console.log(response)
        
    )

希望能成功!!!

【讨论】:

【参考方案2】:

我也遇到了这个问题,但老实说,几分钟后我在浏览器上点击了刷新,没有进行任何更改,并且当时它确实有效。我在命令行中收到了这条消息,因此它可能会为导致问题的原因提供线索:

Not Found: /css/reset/reset.css
[03/Jul/2020 20:52:13] "GET /css/reset/reset.css HTTP/......

【讨论】:

【参考方案3】:

对于 Django 3.0 版添加以下注释

@csrf_protect
def yourfunc(request):
    return render(request, '../your.html', None)

别忘了在你的字段中添加以下标签

<form action="add/" method="post">
  % csrf_token %
...
</form>

【讨论】:

【参考方案4】:

更新:这个答案来自 2011 年。CSRF 今天很容易。

这些天你应该使用render 快捷功能return render(request, 'template.html'),它会自动使用RequestContext,所以下面的建议已经过时了 8 年。

    使用renderhttps://docs.djangoproject.com/en/2.2/topics/http/shortcuts/ 添加CSRF中间件https://docs.djangoproject.com/en/2.2/ref/csrf/ 使用% csrf_token %模板标签 确认您看到 CSRF 令牌值正在生成,并在您的表单请求中提交

原始回复

我的猜测是您在模板中有标签,但它没有呈现任何内容(或者您的意思是您在实际的 HTML 中确认正在生成 CSRF 令牌?)

使用RequestContext 代替字典

render_to_response("foo.html", RequestContext(request, ))

或者确保您的CONTEXT_PROCESSORS 设置中有django.core.context_processors.csrf

https://docs.djangoproject.com/en/dev/ref/contrib/csrf/

Or add the token to your context manually

【讨论】:

做到了!我仍然很难完全理解它,但至少我已经过去茫然地盯着并试图随机改变事物。文档对我帮助不大,非常感谢! 这是文档中的第 3 步 :) 如果您让自己深入挖掘一下,Django 的文档会非常棒。祝你好运! 非常感谢,这解决了我的问题。给大家的一般建议:检查您是否使用正确的参数使用render_to_response(),我搞砸了并给了它3个参数,因此导致了上述错误。【参考方案5】:

对我有用的是从我的settings.py 中注释掉以下行

'django.middleware.csrf.CsrfViewMiddleware'

【讨论】:

这只是完全删除了 CSRF 保护;它没有解决实际问题。【参考方案6】:

在我安装 django-livereload-server 后,某些页面上也随机出现此错误。卸载 django-livereload-server 就可以了。

【讨论】:

【参考方案7】:

尝试使用 render 而不是 render_to_response

from django.shortcuts import render

render(request, "foo.html", )

Django - what is the difference between render(), render_to_response() and direct_to_template()?

如上面链接中所述,它是在 Django 1.3 中引入的,并自动使用 RequestContext

【讨论】:

【参考方案8】:

@Yuji 'Tomita' Tomita 和@Njogu Mbau 提到,在使用render_to_response 时,添加RequestContext 是关键。然而,当我遇到这个问题时,最初让我失望的是,我必须将 RequestContext 添加到 views.py 中最初加载模板的函数和 views.py 中处理来自模板。

另外,仅供参考,这里有一些讨论相同问题的其他链接

Django - CSRF token missing or incorrect Django 403 CSRF token missing or incorrect Django --CSRF token missing or incorrect Django CSRF Cookie Not Set *

【讨论】:

【参考方案9】:

如果您没有使用 CsrfViewMiddleware,那么您必须在任何使用 csrf_token 模板标签的视图以及接受 POST 数据的视图上使用 csrf_protect。

【讨论】:

【参考方案10】:

只需将此添加到您的视图中

return render_to_response("register.html", 'form': form, , context_instance = RequestContext(request))

它会起作用的!

【讨论】:

以上是关于CSRF 令牌丢失或不正确的主要内容,如果未能解决你的问题,请参考以下文章

Django - CSRF 令牌丢失或不正确

CSRF 令牌丢失或不正确。 Django + AngularJS

Django - 403 禁止。 CSRF 令牌丢失或不正确

Django:CSRF 令牌丢失或不正确。 / 避免 % csrf_token %

CSRF 令牌丢失或不正确

CSRF 失败:CSRF 令牌丢失或不正确