济源做网站的公司,做企业网站需要多少钱,中国对外贸易网站,网页微博怎么切换账号一、CSRF跨站请求伪造
CSRF全拼为Cross Site Request Forgery#xff0c;译为跨站请求伪造。
CSRF指攻击者盗用了你的身份#xff0c;以你的名义发送恶意请求。
包括#xff1a;以你名义发送邮件#xff0c;发消息#xff0c;盗取你的账号#xff0c;甚至于购买商品译为跨站请求伪造。
CSRF指攻击者盗用了你的身份以你的名义发送恶意请求。
包括以你名义发送邮件发消息盗取你的账号甚至于购买商品虚拟货币转账…
造成的问题个人隐私泄露以及财产安全。
CSRF请求伪造的示意图
二、CSRF防护
防护思路
1、请求转账页面的时候服务器响应转账页面在cookie中设置一个csrf_token值(随机48位字符串)。
2、客户端在进行post请求的时候在请求头中带上自定义的属性’X-CSRFToken’ 值为cookie中的csrf_token值。(要注意的是此时的post请求浏览器还会自发带着cookie中csrf_token到服务器。)
3、服务器在接收到post请求的时候首先验证响应头中的x-csrftoken值和cookies中的csrf_token是不是一致如果不一致需要return直接结束处理不进行后续工作。
完整步骤
先安装cookie-parser
生成n为随机字符串
function getRandomString(n){var str;while(str.lengthn){strMath.random().toString(36).substr(2);}return str.substr(str.length-n)
}
getRandomString(48); // 调用生成csrf_tokenget请求转账页面的时候在cookie中设置一个csrf_token值(随机48位字符串)
记得安装cookie-parser模块
if(req.methodGET){// 渲染转账页面的时候同时在cookie中设置csrf_token//设置cookie和sessionlet csrf_token getRandomString(48);res.cookie(csrf_token, csrf_token); res.render(temp_transfer);
}接下来在前端页面中post请求时候带上自定义的属性’X-CSRFToken’ 值为cookie中的csrf_token值
$.ajax({url:/transfer,type:post,data:JSON.stringify(params),contentType:application/json,headers:{X-CSRFToken:getCookie(csrf_token)},success: function (resp) {....}
})....function getCookie(name) { //获取cookie的函数var r document.cookie.match(\\b name ([^;]*)\\b);return r ? r[1] : undefined;
}
最后回到服务器端处理post请求的时候判断响应头中的x-csrftoken值和cookies中的csrf_token是不是一致不一致就是CSRF验证不通过直接return
...
else if(req.methodPOST){// 判断响应头中的x-csrftoken值和cookies中的csrf_token进行对比console.log(req.headers[x-csrftoken]);console.log(req.cookies[csrf_token]);if((req.headers[x-csrftoken] req.cookies[csrf_token])){console.log(csrf验证通过);}else{res.send(csrf验证不通过);return}// 以下可以开始正常处理post请求...}三、对每一个POST请求都设置CSRF防护
实际上不仅仅转账需要CSRF防护每一个post请求都需要做csrf的防护措施。
webA项目中的app.js
const router express.Router();router.all(/, (req, res) {if(req.methodGET){res.render(temp_login)}...
});
router.all(/transfer, (req, res) {...else if(req.methodPOST){let {to_account, money} req.body;console.log(to_account, money);//执行转账功能 ....此处省略console.log(假装执行转账操作将当前登录用户的钱转账到指定账户);console.log(已经完成转账${money}元到账户${to_account});res.json({to_account,money});}
});
function csrfProtect(req, res, next){let method req.methodif(methodGET){let csrf_token getRandomString(48);res.cookie(csrf_token, csrf_token);next() //执行跳转到下一个函数执行即app.use(beforeReq,router)中的下一个}else if(methodPOST){// 判断响应头中的x-csrftoken值和cookies中的csrf_token进行对比console.log(req.headers[x-csrftoken]);console.log(req.cookies[csrf_token]);if((req.headers[x-csrftoken] req.cookies[csrf_token])){console.log(csrf验证通过);next()}else{res.send(csrf验证不通过!);return}}
}app.use(csrfProtect,router)