在使用axios
請求egg.js
封裝的post接口時出現missing csrf token
或 invalid csrf token
。踩過坑的新手估計不在少數,本篇記錄一下解決方法。
問題原因
- 引用一下官網的
Web 安全概念
:
Web 應用中存在很多安全風險,這些風險會被黑客利用,輕則篡改網頁內容,重則竊取網站內部數據,更為嚴重的則是在網頁中植入惡意代碼,使得用戶受到侵害。
常見的安全漏洞如下:
XSS
攻擊:對 Web 頁面注入腳本,使用 JavaScript 竊取用戶信息,誘導用戶操作。CSRF
攻擊:偽造用戶請求向網站發起惡意請求。釣魚攻擊
:利用網站的跳轉鏈接或者圖片制造釣魚陷阱。- HTTP參數污染:利用對參數格式驗證的不完善,對服務器進行參數注入攻擊。
- 遠程代碼執行:用戶通過瀏覽器提交執行命令,由於服務器端沒有針對執行函數做過濾,導致在沒有指定絕對路徑的情況下就執行命令。
對於這些風險,Egg框架本身內置了豐富的解決方案。回歸本題,其中出現missing csrf token
就是因為CSRF 的防御方案
。
解決方案如下:
關閉配置(不推薦)
// config/config.default.js
exports.security = {
csrf: {
enable: false,
},
};
注意: 框架的安全插件是默認開啟的。除非清楚的確認后果,否則不建議擅自關閉安全插件提供的功能。
配置請求headers
- 修改config中
security
的配置
// config/config.default.js
exports.security = {
csrf: {
enable: true,
headerName: 'token',
},
};
解釋: 通過 header
的 token
字段傳遞 CSRF token
,默認字段為 x-csrf-token
。
- axios請求配置:
// 例:
async function getData(data) {
try {
let res = await axios({
url: "http://127.0.0.1:7001/api/test/list",
method: 'POST',
data,
headers: {
"token": 'xxxxxxxxx',
}
});
console.log(res.data)
} catch (e) {
console.log(e)
}
}
- 在
Node
環境請求post接口,沒有Cookie
信息,所以還需要在請求的headers
中加上Cookie
,不然會報錯invalid csrf token
。代碼如下:
headers: {
"token": 'xxxxxxxxx',
"Cookie": 'csrfToken=xxxxxxxxx',
}
參考文檔:
歡迎訪問:個人博客地址