Cross Site Request Forgy
跨站請求僞造javascript
過程:html
禁止第三方網站帶 Cookies,爲 Cookies 設置 Same-site 屬性前端
koa 設置方式java
ctx.cookies.set("userId", user.id, { httpOnly: false, sameSite: "strict" });
這種方法較好可是,有些瀏覽器不支持,但未來應該會的ajax
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("驗證碼錯誤"); }
驗證碼有時是會影響用戶體驗的,因此就有了 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" />
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('非法請求') }