CSRF令牌只是在Django中随机激发
我在我的html中有一个表单:
<form id="form" action="" method="post"> {% csrf_token %}
<div>{{form.input1}}</div>
<div>{{form.input2}}</div>
<div>{{form.input3}}</div>
<input type="submit" class="btn" name="submit" value="submit">
</form>
并在我的urls.py:
urlpatterns = [
url(r'^$', views.MyView.as_view(success_url='/'), name='index'),
]
有时当我点击提交时,csrf令牌会被触发,并说csrf令牌丢失或不正确。
首先这是怎么可能的? 该文件说:
这通常只有在存在真正的跨站点请求伪造时,或者由于编程错误,CSRF令牌未包含在POST表单中时才会出现。
从我看到它正确实施。
该错误消息进一步说
它确实如此
根据文件我有这个。
确实如此,但这就是拥有csrf标记的关键所在?
CsrfViewMiddleware
,则必须使用csrf_protect
上使用的任何意见csrf_token
模板标签,以及那些接受POST数据。 根据文档,这是默认激活的。
那么为什么有时会触发(很少)呢?
既然你说这个错误有时只会发生,我认为这个问题可能是你用表单打开了页面,在另一个选项卡上登录,然后提交了表单。
这会导致错误,因为登录时会更新csrf标记。不幸的是,您无法对此做任何事情。
你是动态渲染你的表单还是类似的东西? Django只会将{% csrf_token %}
替换为隐藏的输入字段,并在该标签从头开始存在于模板中时注入csrftoken
cookie。
首先尝试装饰你的观点:
from django.views.decorators.csrf import ensure_csrf_cookie
@ensure_csrf_cookie
def index(request):
return render(request, 'index.html')
这将始终注入cookie。
如果您真的在动态操作表单,您需要使用csrftoken
cookie手动检索csrf标记,然后使用隐藏字段(额外请求参数)或标题在表单中提交它,如文档中所述。