繁体   English   中英

django 1.7 csrf_token无法正常工作:应该如何运作?

[英]django 1.7 csrf_token not working: how is it supposed to work?

第1页:在模板中包含{%csrf_token%}的表单。

第2页:谢谢页面。

当我在页面1上提交表单时,它使用HttpResponseRedirect重定向到页面2 ...因此,如果用户刷新页面,它将无法重新提交...

但是我只是注意到,如果用户从第2页返回到第1页...他可以再次按Submit按钮重新提交相同的表单...所以...当我显示第2页时,有没有一种方法可以使第1页过期?

以防万一,我的中间件类是:

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

尽管从技术上讲,您可以重新生成令牌,并且用户尝试重新提交时,用户将看到“ 403 Forbidden响应”,但这并不是CSRF令牌的本意。 但是,CSRF令牌应该就是这样-可以防止跨站点请求伪造的令牌。

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

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

它仅适用于POST请求。

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

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

流氓请求将没有此密钥,并且您的代码将引发适当的错误(从而防止发生任何操作)。

它并非旨在防止合法的重复请求。 有两种主要方法可以防止这种情况:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM