【问题标题】:Understanding CSRF in Django; hidden field in form and the CSRFCookie了解 Django 中的 CSRF;表单中的隐藏字段和 CSRFCookie
【发布时间】:2012-04-13 18:16:31
【问题描述】:

我正在写下我对 Django 中 CSRF 保护机制的理解。如有错误请指正。

csrfViewMiddleware 创建一个唯一的字符串并将其存储在来自主机的表单的隐藏字段'csrfmiddlewaretoken' 中。由于模仿此表单的恶意网站不知道该字段的值,因此无法使用。

当有人尝试发布表单时,网站会检查 'csrfmiddlewaretoken' 字段及其值。如果设置错误或未设置,则检测到 csrf 攻击。

但是,CSRFCookie 到底是什么? The doc 表示唯一值设置在CSRFCookiehidden field 中。这就是我感到困惑的地方。 cookie 是否会通过嵌入的唯一字符串发送到浏览器?

【问题讨论】:

    标签: django csrf


    【解决方案1】:

    Django 为经过身份验证的用户分配一个存储在 cookie 中的 CSRF 令牌。每次用户发出被认为“不安全”的请求(即 POST、PUT、DELETE)时,都会读取此 cookie 中的值,以验证发出请求的是用户,而不是恶意第三方。

    您放置在表单中的 CSRF 标记实际上是从 cookie 中获取 CSRF 令牌,然后在您提交表单时将其作为 POST 变量传递。

    【讨论】:

    • 所以只有经过身份验证的用户的浏览器才能获得此令牌,而不是所有访问该网站的人。正确吗?
    • 不确定 Django 是如何准确处理它的 - 无论身份验证状态如何,它都可以保护所有用户。基本上,任何能够改变应用程序某些方面的操作都应该具有 CSRF 保护。
    【解决方案2】:

    根据我目前的理解,我对经过验证的答案并不完全满意。

    你可以找到我的版本here

    总而言之,CSRFCookie 是“安全的”,因为同源策略,攻击者无法访问它。浏览器会自动发送这个值。现在,您的表单还必须发送此值(例如,在隐藏字段中)。这意味着您的表单必须知道这个值,并且它可以从 cookie 中获取它。

    攻击者无法从 cookie 中获取令牌,因此无法伪造包含该令牌的恶意代码。

    最后,重要的是用户可以发送 csrf 令牌,并且服务器可以对其进行验证。使用 cookie 是一种方便的方法,但可以以不同的方式实现(例如,服务器可以为每个会话保存 CSRF 令牌)。

    我不是专家,但这就是我的理解。希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-06
      • 2023-03-26
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 2020-10-17
      相关资源
      最近更新 更多