当前位置: 首页 > 面试题库 >

Django-CSRF验证失败

顾均
2023-03-14
问题内容

尝试从教程中制作简单表格时,我收到CSRF验证失败的消息。我对CSRF验证实际上是什么进行了一些研究,据我所知,要使用CSRF验证,你需要在html中使用其中的csrf_token标记之一,但是我没有

这是我的模板:

<form action="/testapp1/contact/" method="post">
    {{ form.as_p }}
    <input type="submit" value="Submit" />
</form>

相当简单,位于contact.html

这是我的urlconf:从django.conf.urls.defaults import *

urlpatterns=patterns('testapp1.views',
    (r'^$', 'index'),
    (r'^contact/$','contact')
)

应用程序名称为testapp1。当我键入URL(http:// localhost:8000 / testapp1 / contact)时,我正确地进入了表单。然后,当我提交表格时,我得到了验证错误。

这是我的看法,尽管我认为这无关紧要:

def contact(request):
    if request.method == 'POST': # If the form has been submitted...
        form = ContactForm(request.POST) # A form bound to the POST data
        if form.is_valid(): # All validation rules pass
            subject = form.cleaned_data['subject']
            message = form.cleaned_data['message']
            sender = form.cleaned_data['sender']
            cc_myself = form.cleaned_data['cc_myself']
            recipients = ['info@example.com']
            if cc_myself:
                recipients.append(sender)
            print 'Sending Mail:'+subject+','+message+','+sender+','+recipients
            return HttpResponseRedirect('/thanks/') # Redirect after POST
    else:
        form = ContactForm() # An unbound form

    return render_to_response('contact.html', {
        'form': form,
    })

问题答案:

解决方法
1。包括{% csrf_token %} 在模板的表单标签内。

2。如果因任何原因,你正在使用render_to_response上的Django 1.3及以上,取而代之的是该render功能。替换为:

# Don't use this on Django 1.3 and above
return render_to_response('contact.html', {'form': form})

有了这个:

return render(request, 'contact.html', {form: form})

该render函数是在Django 1.3版中引入的 -如果你使用的是1.2或更低版本,则必须使用 render_to_responseaa RequestContext:

# Deprecated since version 2.0
return render_to_response('contact.html', {'form': form},
                   context_instance=RequestContext(request))

什么是CSRF保护,我为什么要它?
这是一种攻击,敌人可以迫使你的用户执行令人讨厌的事情,例如转移资金,更改其电子邮件地址等等:

跨站点请求伪造(CSRF)是一种攻击,它迫使最终用户在当前已通过身份验证的Web应用程序上执行不需要的操作。CSRF攻击专门针对状态更改请求而不是数据窃取,因为攻击者无法看到对伪造请求的响应。在社交工程的一点帮助下(例如通过电子邮件或聊天发送链接),攻击者可能会欺骗Web应用程序的用户执行攻击者选择的操作。如果受害者是普通用户,则成功的CSRF攻击会迫使用户执行状态更改请求,例如转账,更改其电子邮件地址等。如果受害者是管理帐户,则CSRF可能会破坏整个Web应用程序。来源:Open Web应用程序安全性项目

即使你现在不关心这种事情,应用程序也可能会扩展,因此最佳实践是保持CSRF保护。

CSRF保护不应该是可选的吗?

它是可选的,但默认情况下处于启用状态(默认情况下包含CSRF中间件)。你可以将其关闭:

  • 通过用装饰csrf_excempt器装饰特定的视图。
  • 通过从以下位置的中间件列表中删除CSRF中间件来获取每个视图 settings.py
    如果在系统范围内将其关闭,则可以通过用装饰csrf_protect器装饰特定的视图来将其打开。


 类似资料:
  • 问题内容: 我正在关注Django 1.3 Web开发。对于登录,我收到以下错误 这是我的settings.py随附的APPS。这正是书上所说的样子。 这本书说,它应该包含django.contrib.auth.views.login ..并且我将其包含在 和我的registration / login.html …复制自本书的副本。它应该做。 问题答案: 你需要将模板标记添加为Django模板中

  • 问题内容: 我已在中注释掉了csrf处理器和中间件产品线 但是,当我使用Ajax发送请求时,Django仍然会响应“ csrf令牌不正确或丢失”,并且在将X-CSRFToken添加到标头后,请求将会成功。 这里发生了什么 ? 问题答案: 如果只需要一些视图而不使用CSRF,则可以使用@csrf_exempt:

  • 问题内容: 我尝试建立一个非常简单的网站,在该网站中可以将数据添加到sqlite3数据库中。我有两个文本输入的POST表单。 index.html: forms.py: views.py: 但是,当我单击“提交”按钮时,出现403错误: 我已经包含{% csrf_token %}在index.html中。但是,如果这是一个RequestContext问题,我真的不知道在哪里以及如何使用它。我希望所

  • 问题内容: 我重置了本地flask环境,但是没有通过捕获它的依赖项,pip freeze然后再将其删除。因此,我不得不重新安装整个堆栈的最新版本。 现在,我突然无法使用表单进行验证了。Flask声称CSRF将丢失。 第一次发送Get邮件时,我按预期检索了一个空邮件。现在,我填写表格并提交并form.errors显示: 真奇怪 我想知道Flask-WTF是否已更改,并且使用错误。 我可以清楚地看到存

  • 问题内容: 我在CSRF令牌方面遇到问题。当我提交表单时,正在生成一个新的表单,但是我想我正在生成两个不同的令牌,这有点困惑。还有一个名为的令牌,因此我在开发人员工具中看到了两个不同的cookie(XSRF- TOKEN和_csrf),发布后它们没有变化。 我想要做的是为每个帖子请求生成一个新令牌,并检查它是否有效。我知道为了安全起见应该这样做,但是我坚持了下来。 漫长的一天,我是Express和

  • 我有Zend框架2的应用基础。我有一个带有CSRF字段的表单。如果我填写表单并在大约5分钟后提交,它会给我验证错误。 所以我认为会话配置可能有问题。然后我在如下所示 但问题依然存在。你知道如何解决这个问题吗? --更新-- 我的表单类包含CSRF元素,如下所示, 这些似乎都不起作用。