django 1.7 csrf_token不工作:它应该如何工作?

时间:2015-02-01 17:47:55

标签: python django

第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',
)

2 个答案:

答案 0 :(得分:1)

这不是CSRF令牌的意图,但从技术上讲,您可以重新生成令牌,用户在尝试重新提交时会看到403 Forbidden响应。但是,CSRF令牌应该就是这样 - 一个阻止跨站点请求伪造的令牌。

如果用户应该只能提交一次表单,那么应该在表单验证中处理并对数据库进行检查。否则,返回并重新提交表单通常被用户视为明确的操作,其处理方式与提交新表单相同。

答案 1 :(得分:-1)

CSRF令牌旨在防止其他网站向您的网页发布内容,从而防止创建垃圾/垃圾邮件记录。

它仅适用于POST请求。

为了防止有人编写一个简单地向您的页面提交垃圾数据的脚本,使用密钥生成一个唯一的令牌(攻击者不会知道)。

在来自您网站的合法请求中 - 您的代码使用此密钥生成令牌并将其作为请求的一部分发送。

恶意请求不会有此密钥,并且您的代码会引发相应的错误(从而阻止发生任何操作)。

它不是为防止合法的重复请求而设计的。有两种主要方法可以防止这种情况:

  1. 确保您在POST后始终重定向(这是为了防止有人点击刷新然后再次发送相同的请求;虽然几乎所有现代浏览器都会在这样做时发出警告)。

  2. 控制服务器端以防止可疑的重复条目。