第1页:我的模板中包含{%csrf_token%}的表单。
第2页:谢谢页面。
当我在第1页上提交表单时,它使用HttpResponseRedirect重定向到第2页...因此,如果用户刷新页面,则无法重新提交...
但我只是注意到,如果用户返回第2页到第1页......他可以再次按“提交”按钮重新提交相同的表单......那么......有没有办法让我在第1页失效显示第2页?
以防万一,我的中间件类是:
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
答案 0 :(得分:1)
这不是CSRF令牌的意图,但从技术上讲,您可以重新生成令牌,用户在尝试重新提交时会看到403 Forbidden
响应。但是,CSRF令牌应该就是这样 - 一个阻止跨站点请求伪造的令牌。
如果用户应该只能提交一次表单,那么应该在表单验证中处理并对数据库进行检查。否则,返回并重新提交表单通常被用户视为明确的操作,其处理方式与提交新表单相同。
答案 1 :(得分:-1)
CSRF令牌旨在防止其他网站向您的网页发布内容,从而防止创建垃圾/垃圾邮件记录。
它仅适用于POST请求。
为了防止有人编写一个简单地向您的页面提交垃圾数据的脚本,使用密钥生成一个唯一的令牌(攻击者不会知道)。
在来自您网站的合法请求中 - 您的代码使用此密钥生成令牌并将其作为请求的一部分发送。
恶意请求不会有此密钥,并且您的代码会引发相应的错误(从而阻止发生任何操作)。
它不是为防止合法的重复请求而设计的。有两种主要方法可以防止这种情况:
确保您在POST后始终重定向(这是为了防止有人点击刷新然后再次发送相同的请求;虽然几乎所有现代浏览器都会在这样做时发出警告)。
控制服务器端以防止可疑的重复条目。