CSRF攻擊與防護

CSRF

Cross Site Request Forgy
跨站請求僞造javascript

須要條件

  • 用戶登陸 A 網站
  • A 網站確認身份
  • B 網站頁面向 A 網站發起請求(帶 A 網站身份)

CRSF 攻擊危害

  • 利用用戶登陸態---盜取用戶資金(轉帳,消費)
  • 用戶不知情---冒充用戶發帖背鍋
  • 完成業務請求---損壞網站名譽
  • ...

CSRF 攻擊防護

  • 過程:html

    • B 網站向 A 網站請求
    • 帶 A 網站 Cookies
    • 不訪問 A 網站的前端
    • referer 爲 B 網站(這裏的 referer 爲爲數很少的錯誤單詞)
  • 禁止第三方網站帶 Cookies,爲 Cookies 設置 Same-site 屬性前端

koa 設置方式java

ctx.cookies.set("userId", user.id, {
  httpOnly: false,
  sameSite: "strict"
});

這種方法較好可是,有些瀏覽器不支持,但未來應該會的ajax

  • 不訪問 A 網站的前端
    • 在前端頁面加入驗證消息
    • 驗證碼
    • 安裝第三方插件生成驗證碼
    • 運行npm install ccap --save
captcha.captcha = async function(ctx, next) {
  var ccap = require("ccap");
  var capt = ccap();
  var data = 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;
};

下面調用上面npm

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 });

驗證cookie

if (!data.crsfToken) {
  throw new Error("CSRF Token 爲空");
}
if (data.csrfToken !== ctx.cookies.get("csrfToken")) {
  throw new Erroe("CSRF Token錯誤");
}

ajax 作法
html 頭部dom

<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('非法請求')
}
相關文章
相關標籤/搜索