Django的CSRF(Cross-Site Request Forgery)保护机制通过使用两个Token来协同工作,有效防止跨站攻击。这两个Token分别是:
CSRF Token:这是一个随机生成的字符串,通常嵌入在HTML表单中作为一个隐藏字段(<input type="hidden" name="csrfmiddlewaretoken" value="...">
)。这个Token在每次表单提交时都会被发送到服务器。
CSRF Cookie:这是一个存储在用户浏览器中的Cookie,通常命名为csrftoken
。这个Cookie的值与表单中的CSRF Token相匹配。
生成Token:
提交表单:
验证Token:
同源策略:
Token验证:
Cookie的SameSite属性:
SameSite
属性为Lax
,这意味着浏览器只会在同站点请求或顶级导航(如点击链接)时发送Cookie。这进一步减少了CSRF攻击的风险。启用CSRF保护:
django.middleware.csrf.CsrfViewMiddleware
来实现。在表单中使用CSRF Token:
{% csrf_token %}
标签来生成CSRF Token并嵌入到表单中。<form method="post">
{% csrf_token %}
<!-- 其他表单字段 -->
<input type="submit" value="提交">
</form>
在AJAX请求中使用CSRF Token:
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,
'Content-Type': 'application/json'
},
body: JSON.stringify({ key: 'value' })
});
Django的CSRF保护机制通过生成和验证两个Token(CSRF Token和CSRF Cookie)来确保请求的合法性。这种机制有效防止了跨站请求伪造攻击,保护了用户的数据安全。通过合理配置和使用,开发者可以轻松地在Django应用中实现CSRF保护。