插件窝 干货文章 Django CSRF保护机制:两个Token如何协同工作并有效防止跨站攻击?

Django CSRF保护机制:两个Token如何协同工作并有效防止跨站攻击?

表单 Token CSRF Cookie 36    来源:    2025-03-14

Django 的 CSRF(Cross-Site Request Forgery)保护机制通过使用两个 CSRF Token 来有效防止跨站攻击。这两个 Token 分别是:

  1. CSRF Token in the Form:嵌入在 HTML 表单中的 CSRF Token。
  2. CSRF Token in the Cookie:存储在用户浏览器中的 CSRF Token。

1. CSRF Token in the Form

当 Django 渲染一个包含表单的页面时,它会自动在表单中插入一个隐藏的 CSRF Token。这个 Token 是一个随机生成的字符串,通常通过 {% csrf_token %} 模板标签插入到表单中。例如:

<form method="post">
    {% csrf_token %}
    <input type="text" name="username">
    <input type="submit" value="Submit">
</form>

在提交表单时,这个 Token 会随着表单数据一起发送到服务器。

2. CSRF Token in the Cookie

Django 还会在用户的浏览器中设置一个名为 csrftoken 的 Cookie。这个 Cookie 也包含一个随机生成的字符串,但与表单中的 CSRF Token 不同。

协同工作流程

当用户提交表单时,Django 会执行以下步骤来验证 CSRF Token:

  1. 表单提交:用户提交表单时,表单中的 CSRF Token 会随请求一起发送到服务器。
  2. Cookie 验证:Django 会从请求中提取表单中的 CSRF Token,并与存储在用户浏览器中的 csrftoken Cookie 进行比较。
  3. Token 匹配:如果表单中的 CSRF Token 与 Cookie 中的 CSRF Token 匹配,请求被认为是合法的,Django 会继续处理请求。如果不匹配,Django 会拒绝请求并返回 403 Forbidden 错误。

防止跨站攻击的原理

CSRF 攻击的原理是攻击者诱使用户在不知情的情况下提交恶意请求。由于浏览器会自动发送 Cookie,攻击者可以利用这一点伪造请求。

Django 的 CSRF 保护机制通过以下方式防止这种攻击:

  • 双重验证:攻击者无法获取到用户的 csrftoken Cookie,因为浏览器遵循同源策略,不会让恶意网站访问到该 Cookie。因此,攻击者无法伪造一个包含有效 CSRF Token 的表单。
  • 随机性:CSRF Token 是随机生成的,攻击者无法预测或伪造有效的 Token。

总结

Django 的 CSRF 保护机制通过表单中的 CSRF Token 和 Cookie 中的 CSRF Token 双重验证,确保只有合法的请求才能被处理。这种机制有效地防止了跨站请求伪造攻击,保护了用户的数据安全。