Django項目中的settings.py裏面的django.middleware.csrf.CsrfViewMiddleware中間件,使得Django默認帶有csrf驗證
通過中間件在cookie中設置了csrf_token,實際上是在session中存儲了未加密的csrf_token,並且將生成的sessionID編號存儲在cookie中
確定settings.py文件中是否存在django.middleware.csrf.CsrfViewMiddleware
ajax發送請求
在js裏面,獲取到cookie中的csrf_token,將其添加到ajax的請求頭中
// 正則匹配cookie中的csrftoken,傳入cookie名字
function getCookie(name) {
var r = document.cookie.match("\\b" + name + "=([^;]*)\\b");
return r ? r[1] : undefined;
}
$.ajax({
...
headers: {
"X-CSRFToken": getCookie("csrftoken")
},
....
表單提交
在form表單中添加{% csrf_token %}
<form action="/" method="post">
{% csrf_token %}
...
驗證過程:
-
獲取請求頭 / (表單)中的csrf_token(加密的),然後使用secret_key解密,得到解密後csrf_token。
-
通過cookie中的sessionID,取到服務器內部存儲的session中的csrf_token(未加密的)。
-
將兩者的值進行比較