【问题标题】:Cross Site Request Forgery protection in Django - a better explanation?Django 中的跨站点请求伪造保护 - 更好的解释?
【发布时间】:2013-01-11 07:10:32
【问题描述】:

我刚刚完成了 Django 1.4 教程的第 4 部分,我敢肯定他们只是把 CSRF 和通用视图扔进去把我搞糊涂了。

好的,我现在得到了一般视图,但我不明白 CSRF 保护发生了什么。

这就是我认为正在发生的事情:CSRF 令牌是应用程序中使用的模块生成的哈希/密钥,如果已登录,则为登录用户。令牌以某种方式通过 POST 方法表单发送到接收视图再次生成散列并将其与随表单发送的散列进行比较,以确保没有人窥探?我完全搞错了吗?

在教程中使用了 Django 手册的其余部分,这是迄今为止我读过的最令人困惑的手册页。

【问题讨论】:

  • 我不知道该说什么,你完全明白。它是以某种方式通过调用csrf标签{% csrf_token %}添加的,它使用令牌生成的服务器端呈现隐藏的输入。本质上,您必须至少呈现页面以获取此令牌/从而验证您的表单帖子。
  • 好吧,看起来我设法将那个文档页面压缩成两个句子,我猜这对于遵循教程的人来说会更好。不过感谢您的确认,至少需要。
  • 你指的是 CSRF 上的文档吗? docs.djangoproject.com/en/dev/ref/contrib/csrf 我明白为什么教程会简单地刷过这个概念.. 深入研究它会令人困惑。

标签: django csrf


【解决方案1】:

这很令人困惑,因为它解决了网络浏览器的一个微妙漏洞。

假设我们有两个网站:site.com 和 evil.com。然后 evil.com 的所有者,如果他知道 site.com 网站的结构(如果他会使用,这很容易),就可以设置一个针对它的表单。

<form action="http://target.com/my_account/_delete" method="POST">
    <input type="submit" value="Click Here for candy"></input>
</form>

点击它并登录到 site.com 的任何人都会立即触发链接到的操作(在这种情况下,销毁他们自己的帐户)。

csrf 令牌的想法是合法形式如下所示:

<form action="http://target.com/my_account/_delete" method="POST">
    <input type="hidden" name="csrf_token" value="AEyaF8af8AIHJFA0L"></input>
    <input type="submit" value="Don't click this unless absolutely sure!"></input>
</form>

并且由于此值是用户特定的,并且只有网站知道并显示在网站上,因此用户现在是安全的,并且如果不先通过正确的页面就不能删除他们的帐户,因为攻击者的任何页面都不会知道这个值。

希望这更清楚。

【讨论】:

  • 那么,实际上与窥探无关而与网络钓鱼有关?我认为我对文档的问题是,尚不清楚一部分用于传输,而另一半用于在另一端拾取碎片。此外,我自己的错,但我正在浏览教程的这一部分,并且隐藏字段卡在它自己的 div 中,它看起来不像令牌是表单的一部分。
  • 是的,这是为了验证所有请求都来自合法页面。
猜你喜欢
  • 2018-04-25
  • 2019-04-10
  • 1970-01-01
  • 2014-08-31
  • 2013-07-17
  • 2014-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多