Django:CSRF 验证失败:CSRF 令牌丢失或不正确

Django:CSRF 验证失败:CSRF 令牌丢失或不正确

在本文中,我们将介绍 Django 中的 CSRF(跨站请求伪造)验证,并解释当出现 “CSRF Failed: CSRF token missing or incorrect.” 错误时该如何解决。

阅读更多:Django 教程

什么是 CSRF 验证?

CSRF 是一种攻击方式,即跨站请求伪造。攻击者通过伪装成受信任的用户,在用户不知情的情况下发送恶意请求。为了防止此类攻击,Django 引入了 CSRF 验证。

CSRF 验证的原理很简单:每次用户与 Django 交互时,Django 会在表单中生成一个唯一的 CSRF 令牌并将其返回给用户。用户在提交表单时,必须携带该令牌,Django 会验证令牌的正确性,以确保该请求是合法的。

验证失败的原因

“CSRF Failed: CSRF token missing or incorrect.” 错误的原因通常是由于表单提交时没有正确携带 CSRF 令牌。下面是一些可能导致这个错误的情况:

  1. 忘记在表单中添加 {% csrf_token %} 模板标签;
  2. CSRF 令牌过期或失效;
  3. 使用 AJAX 或其他方式进行请求,在请求头中没有包含正确的 CSRF 令牌;
  4. 反向代理服务器没有正确传递 CSRF 令牌。

解决方法

下面是一些常见的解决方法,用于解决 “CSRF Failed” 错误:

方法一:在表单中添加 CSRF 令牌

在 Django 的模板中,为了保证表单的安全性,必须在表单中添加 {% csrf_token %} 模板标签。这将生成一个隐藏字段,其中包含了 CSRF 令牌。

示例:

<form method="post">
  {% csrf_token %}
  <!-- 其他表单字段 -->
  <button type="submit">提交</button>
</form>
HTML

确保在每个需要进行 CSRF 验证的表单中都添加了该标签。

方法二:在 AJAX 请求中添加 CSRF 令牌

如果你使用 AJAX 或其他方式进行请求,需要手动将 CSRF 令牌添加到请求头中。

示例:

$.ajax({
  url: "/example/",
  method: "POST",
  headers: {
    "X-CSRFToken": "{{ csrf_token }}"
  },
  // 其他参数
});
JavaScript

在上述示例中,{{ csrf_token }} 是 Django 生成的 CSRF 令牌。

方法三:禁用 CSRF 验证(仅限于安全环境)

如果你在一个相对较为安全的环境中开发,并且确定不会受到 CSRF 攻击,你可以考虑禁用 CSRF 验证。但请注意,禁用 CSRF 验证是一种非常危险的行为,只能在特殊情况下使用。

在 Django 的 settings.py 文件中,找到以下代码:

MIDDLEWARE = [
    # 其他中间件
    'django.middleware.csrf.CsrfViewMiddleware',
    # 其他中间件
]
Python

'django.middleware.csrf.CsrfViewMiddleware' 注释掉即可禁用 CSRF 验证。

总结

CSRF 验证是保护网站免受跨站请求伪造攻击的重要措施。通过在表单中添加 CSRF 令牌,可以有效地防止恶意请求。当出现 “CSRF Failed: CSRF token missing or incorrect.” 错误时,需要检查表单是否添加了 CSRF 令牌,并确保在 AJAX 请求中正确携带 CSRF 令牌。如果确实需要,在安全环境下才可以禁用 CSRF 验证。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册