推荐答案
在 Django 应用中,防止跨站请求伪造 (CSRF) 攻击的主要方法是使用 Django 内置的 CSRF 保护机制。以下是推荐的实现方式:
在表单中使用
{% csrf_token %}模板标签: 在 Django 模板中,确保所有表单都包含{% csrf_token %}标签。这个标签会在表单中生成一个隐藏的 CSRF 令牌字段,用于验证请求的合法性。<form method="post"> {% csrf_token %} <!-- 其他表单字段 --> <input type="submit" value="提交"> </form>在视图中启用 CSRF 中间件: Django 默认启用了
django.middleware.csrf.CsrfViewMiddleware中间件,它会自动处理 CSRF 保护。确保该中间件在MIDDLEWARE设置中启用。MIDDLEWARE = [ # 其他中间件 'django.middleware.csrf.CsrfViewMiddleware', # 其他中间件 ]处理 AJAX 请求中的 CSRF 令牌: 对于 AJAX 请求,需要在请求头中包含 CSRF 令牌。可以通过以下方式实现:
// www.javascriptcn.com code example function getCookie(name) { let cookieValue = null; if (document.cookie && document.cookie !== '') { const cookies = document.cookie.split(';'); for (let i = 0; i < cookies.length; i++) { const cookie = cookies[i].trim(); if (cookie.substring(0, name.length + 1) === (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; } const csrftoken = getCookie('csrftoken'); fetch('/your-endpoint/', { method: 'POST', headers: { 'X-CSRFToken': csrftoken, }, body: JSON.stringify({ /* 请求数据 */ }), });
本题详细解读
什么是 CSRF 攻击?
跨站请求伪造 (CSRF) 是一种网络攻击,攻击者诱使用户在不知情的情况下提交恶意请求。例如,攻击者可以通过伪造的链接或表单,让用户在登录状态下执行非预期的操作,如转账、修改密码等。
Django 如何防止 CSRF 攻击?
Django 通过以下机制防止 CSRF 攻击:
CSRF 令牌: Django 为每个用户会话生成一个唯一的 CSRF 令牌,并将其嵌入到表单中。当表单提交时,Django 会验证该令牌,确保请求来自合法的源。
CSRF 中间件:
CsrfViewMiddleware中间件会自动处理 CSRF 保护。它会检查所有 POST、PUT、PATCH 和 DELETE 请求中的 CSRF 令牌,并在令牌无效时拒绝请求。AJAX 请求的 CSRF 保护: 对于 AJAX 请求,Django 要求开发者在请求头中包含 CSRF 令牌。这可以通过 JavaScript 从 cookie 中提取令牌并添加到请求头中来实现。
如何自定义 CSRF 保护?
在某些情况下,可能需要自定义 CSRF 保护行为。例如,可以通过以下方式实现:
禁用特定视图的 CSRF 保护: 使用
@csrf_exempt装饰器可以禁用特定视图的 CSRF 保护。from django.views.decorators.csrf import csrf_exempt @csrf_exempt def my_view(request): # 视图逻辑手动验证 CSRF 令牌: 在某些情况下,可能需要手动验证 CSRF 令牌。可以使用
csrf_protect装饰器或ensure_csrf_cookie装饰器来实现。from django.views.decorators.csrf import csrf_protect @csrf_protect def my_view(request): # 视图逻辑
通过以上方法,可以有效防止 Django 应用中的 CSRF 攻击,确保应用的安全性。