【问题标题】:django 1.7 csrf_token not working: how is it supposed to work?django 1.7 csrf_token 不工作:它应该如何工作?
【发布时间】:2015-03-31 16:37:30
【问题描述】:

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

【问题讨论】:

    标签: python django


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      它仅适用于 POST 请求。

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

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

      恶意请求将没有此密钥,您的代码将引发适当的错误(从而阻止任何操作发生)。

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

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

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

      【讨论】:

      • 这根本不是 CSRF 令牌的工作方式或它应该做什么。见the documentationhow it works
      • Wikipedia 也有很好的解释。 Django 同时支持“同步器令牌模式”和“Cookie-to-Header 令牌”方法来防止 CSRF。
      • 我所写的正是它的工作原理——您所链接的是它的 django 特定实现。在同一页面中,“这确保只有源自您网站的表单才能用于 POST 数据。” 这是我响应的第一行 “CSRF 令牌已设计防止其他网站将内容发布到您的网页”.
      • '一点也不'现在我重新阅读了您的答案,对此感到抱歉。但是,您听起来像是 CSRF 令牌可以防止一般的垃圾邮件/垃圾邮件,但这不是它的作用。跨站点请求伪造是一种攻击,其中恶意网站使用访问者的身份验证 cookie 将自己验证为该访问者。 CSRF 令牌可以防止这种情况 - 仅此而已。没有什么可以阻止该恶意网站获取自己的令牌并提交垃圾邮件。
      • 实际上,CSRF 不涉及身份验证元素。它只是防止伪造请求;甚至是匿名的。
      猜你喜欢
      • 2016-07-31
      • 2015-06-14
      • 2022-11-14
      • 1970-01-01
      • 2021-10-22
      • 2012-01-10
      • 1970-01-01
      • 2013-04-04
      • 2020-01-20
      相关资源
      最近更新 更多