CSRF
Cross Site Request Forgy
跨站請求偽造

需要條件
- 用戶登錄 A 網站
- A 網站確認身份
- B 網站頁面向 A 網站發起請求(帶 A 網站身份)
CRSF 攻擊危害
- 利用用戶登錄態---盜取用戶資金(轉賬,消費)
- 用戶不知情---冒充用戶發帖背鍋
- 完成業務請求---損壞網站名譽
- ...
CSRF 攻擊防御
-
程序:
- B 網站向 A 網站請求
- 帶 A 網站 Cookies
- 不訪問 A 網站的前端
- referer 為 B 網站(這里的 referer 為為數不多的錯誤單詞)
-
禁止第三方網站帶 Cookies,為 Cookies 設定 Same-site 屬性
koa 設定方式
ctx.cookies.set("userId", user.id, {
httpOnly: false,
sameSite: "strict"
});
這種方法較好但是,有些瀏覽器不支持,但將來應該會的

- 不訪問 A 網站的前端
- 在前端頁面加入驗證訊息
- 驗證碼
- 安裝第三方插件生成驗證碼
- 運行
npm install ccap --save
captcha.captcha = async function(ctx, next) {
var ccap = require("ccap");
var capt = ccap();
var data = https://www.cnblogs.com/ygjzs/p/capt.get();
captcha.setCache(ctx.cookies.get("userId"), data[0]);
ctx.body = data[1];
};
// 設定
captcha.setCache = function(uid, data) {
console.log(uid, dtat);
cache[uid] = data;
};
//驗證
capthcha.validCache = function(uid, dtat) {
return cache[uid] === data;
};
下面呼叫上面
console.log(data.captcha);
//沒有驗證碼
if (!data.captch) {
throw new Erroe("驗證碼錯誤");
}
//驗證碼不匹配
var captcha = require("../tools/captcha");
var result = captcha.validCache(ctx.cookies.get("userID"), data.captcha);
console.log("result", result);
if (!result) {
throw new error("驗證碼錯誤");
}
- 不訪問 A 網站的前端
- 在前端頁面加入驗證訊息
- token
驗證碼有時是會影響用戶體驗的,所以就有了 taken,一般為隱藏的文本框
var csrfToken = parseInt(Math.random() * 99999999, 10);
ctx.cookies.set("csrfToken", csrfToken);
//渲染時
ctx.render("post", { post, comments, csrfToken });
驗證
if (!data.crsfToken) {
throw new Error("CSRF Token 為空");
}
if (data.csrfToken !== ctx.cookies.get("csrfToken")) {
throw new Erroe("CSRF Token錯誤");
}
ajax 做法
html 頭部
<meta http-equiv="X-UA-Compatible" content="csrfToken" name="csrf_token" />
referer 為 B 網站
- 驗證 referer
- 禁止來自第三方網站的請求
var referer = ctx.request.header.referer;
// console.log(ctx.request.header, referer);
if(!^https?:\/\/loaclhost/.test(referer)){
// if(referer.indexOf('localhost')===-1)//驗證不全面,所以要采用上面的做法
throw new Error('非法請求')
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/3943.html
標籤:訊息安全
上一篇:XSS攻擊與防御
下一篇:前端的Cookies
