跳到主要内容

简述django 中 csrf 的实现机制?

参考答案:

Django中的CSRF(Cross-Site Request Forgery)防护机制是通过在表单中添加一个隐藏的输入字段来实现的,这个字段包含一个随机生成的令牌(token)。该令牌在服务器端生成,并在用户浏览器中存储为cookie。当表单被提交时,令牌值将随表单数据一起发送到服务器进行验证。

以下是Django中CSRF的实现机制:

  1. 生成令牌:当用户首次访问Django网站时,服务器会生成一个随机的CSRF令牌并将其存储在用户的cookie中。这个令牌通常被命名为csrftoken
  2. 表单中包含令牌:当Django渲染表单时,它会在表单中添加一个隐藏的输入字段,字段名为csrfmiddlewaretoken,并将存储在cookie中的CSRF令牌值作为该字段的值。
  3. 提交表单:当用户提交表单时,浏览器会将csrfmiddlewaretoken字段及其值一起发送到服务器。
  4. 验证令牌:Django的中间件(middleware)会拦截所有POST请求,并检查是否包含csrfmiddlewaretoken字段及其值。如果请求中缺少该字段或其值与存储在服务器端的令牌不匹配,中间件将拒绝处理该请求,并返回一个403 Forbidden错误。

通过这种方式,Django可以确保只有合法用户才能提交表单,因为只有拥有有效CSRF令牌的用户才能通过验证。这有助于防止跨站请求伪造攻击,其中攻击者可能试图在用户不知情的情况下提交表单。

需要注意的是,Django还提供了一些装饰器和中间件选项,允许开发人员更细粒度地控制CSRF防护机制的行为。例如,可以使用csrf_exempt装饰器来排除特定视图函数的CSRF保护,或使用csrf_exemptcsrf_protect中间件来全局禁用或启用CSRF保护。