Django-CSRF验证失败
尝试从教程中制作简单表格时,我收到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 abovereturn 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.0return 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-CSRF验证失败 的全部内容, 来源链接: utcz.com/qa/421718.html