【问题标题】:Don't understand how Django's CSRF protection works不明白 Django 的 CSRF 保护是如何工作的
【发布时间】:2016-11-05 04:11:17
【问题描述】:

阅读此section of the Django docs,他们建议在 cookie 中设置一个 csrftoken,然后让客户端框架将其放入将在服务器端请求上验证的标头中。但是,在 cookie 中包含令牌是否会破坏目的,因为 cookie 是根据每个用户的请求发送的?

或者这里的“安全性”是 Django 在标头中检查该值而不是检查 cookie 值本身?

我确实理解为什么这适用于同步提交,但在这种情况下,csrftoken 直接写入页面而不是存储在 cookie 中,这似乎更安全。

来自OWASP page on reviewing code for CSRF

检查请求是否有有效的会话 cookie 是不够的,我们 需要检查每个发送的 HTTP 请求是否发送了唯一标识符 到应用程序。 CSRF 请求不会有这个有效的唯一性 标识符。 CSRF 请求没有这个唯一请求的原因 identifier 是唯一的 ID 在页面上呈现为隐藏字段 并在按下链接/按钮后附加到 HTTP 请求 选择。攻击者将不知道这个唯一 ID,因为它 是随机的,并且每个链接、每个页面动态呈现。

【问题讨论】:

    标签: javascript django csrf django-csrf


    【解决方案1】:

    你误解了一些事情。

    令牌始终在 cookie 中;您链接到的代码是为了将它 out 从您的 JS 中的 cookie 中取出,以便您可以将其发回。

    关键是,正如您的引文所示,试图从不在网站上的页面发帖的攻击者将没有该 cookie,因此将无法将正确的值注入表单或标题。

    【讨论】:

    • “令牌始终在 cookie 中”不正确。不通过 ajax 发送的普通表单也必须在隐藏输入字段中包含 csrf 令牌。
    • 我从 OWASP 页面的理解是,cookie 不是处理此问题的好方法,因为它们会自动为域设置。因此,如果我让您单击 www.socialnetwork.com/myAccount/delete,您的 cookie 将被发送,就像为每个 www.socialnetwork.com 请求发送它们一样。您是说在标头而不是 cookie 中检查 csrftoken 的行为是什么使它成为一种可行的方法?
    • @AntonBessonov CSRF 保护通过将 cookie 与标头/隐藏输入进行比较来工作。如果不利用其他漏洞(例如 XSS),潜在的攻击者无法从 cookie 中获取正确的值,因此在发生攻击的情况下,标头/隐藏输入中的 CSRF 令牌不会与 cookie 具有相同的值。当这些值不匹配时,请求将被拒绝。但是,要使其正常工作,必须始终在 cookie 中设置令牌。
    【解决方案2】:

    我不熟悉 django csrf 保护,但我认为它与其他框架中的其他 csrf 保护一样工作。

    诀窍是,通过 cookie 向客户端发送 csrf 令牌,客户端使用 header 将其发送回服务器。服务器忽略 cookie,但不忽略标头。它如何防止 csrf 攻击?例如,攻击者可以绑定<img src="yourwebsite.com/action/destroy/data">(或通过javascript发送post请求)。您的浏览器会随其发送 csrf cookie(以及会话 cookie)。因为缺少标头 - 防止攻击。

    与表单相同。我认为标题和表单都同样安全。

    但是在这两种情况下,如果你有 xss 漏洞,你就会迷失方向。

    编辑:正如 Daniel 指出的那样,删除 csrf cookie 是有意义的。但这不是出于安全原因。

    【讨论】:

    • cookie 不会被忽略,它在 Django 的 CSRF 保护中是必不可少的。 Daniel 指出读取 cookie 而不是删除 cookie 是有意义的。攻击者可以使用一些随机的 CSRF 令牌轻松添加标题或隐藏输入字段,因此仅检查这些是不够的。为确保保护,标头/隐藏输入值必须与 cookie 的值相同。攻击者将无法获取 cookie 的值,因此伪造的请求将在 cookie 和标头/隐藏输入中具有不同的值,并被拒绝。合法请求将具有匹配的值。
    猜你喜欢
    • 1970-01-01
    • 2012-07-21
    • 2011-06-27
    • 2012-06-28
    • 2012-12-01
    • 1970-01-01
    • 2020-04-14
    • 2021-03-30
    • 1970-01-01
    相关资源
    最近更新 更多