【问题标题】:Django: Generate new CSRF token per request/formDjango:为每个请求/表单生成新的 CSRF 令牌
【发布时间】:2012-09-18 21:23:32
【问题描述】:

我们可以为每个表单请求甚至每个请求更改 CSRF 令牌,而不是为一个活动会话更改相同的令牌吗?

【问题讨论】:

  • 出于兴趣:你想达到什么目的?
  • 增加安全实践。事件很难,攻击者仍有机会窃取 session-cookie 上的 csrf 令牌

标签: django csrf


【解决方案1】:

假设您有权访问 request 对象:

from django.middleware.csrf import rotate_token
rotate_token(request)

【讨论】:

    【解决方案2】:

    在 csrf 中间件中,他们做了这样的事情,这会覆盖 cookie 集:

    request.META["CSRF_COOKIE"] = _get_new_csrf_key()
    

    您可以通过from django.middleware.csrf import _get_new_csrf_key() 导入_get_new_csrf_key()。由于这是一种私有方法,我建议不要使用这样的黑客攻击。

    【讨论】:

    • 谢谢。无论如何要将此添加到管理页面?
    • 你能指定你想在哪里添加exaclty吗?
    • 简单,管理站点上每个包含表单的页面请求都需要生成新的 csrf 令牌。我不想重写管理视图。我还没有深入了解 contrib.admin 代码,但我相信我们不能为了做到这一点而进行子类化。那么,唯一的办法就是直接修改contrib.admin,对吗?
    • 如果每个请求都是一个,您可以编写一个自定义中间件来创建此令牌并将其保存在会话中。如果您当前正在使用管理员,只需要找到一种方法来检查中间件(可以通过 url 检查等来完成)。
    【解决方案3】:

    如果你想在中间件中使用它:

    from django.middleware.csrf import rotate_token
    
    class CSRFRefresh(object):
        def process_response(self, request, response):
            rotate_token(request)
            return response
    

    【讨论】:

      猜你喜欢
      • 2013-04-25
      • 2014-03-05
      • 2018-07-29
      • 2012-05-15
      • 1970-01-01
      • 2015-05-18
      • 2014-01-06
      • 2018-11-22
      • 2014-12-13
      相关资源
      最近更新 更多