egg.js中实现RESTfull api,vue请求post数据提示 missing csrf token
跨域
请求的时候,需要把 cookie 里面的 CSRF 带到 headers 里面
建议先看文档, 可以把 csrf 保护关掉或者像楼上说的把csrf信息带到 token 中 安全威胁csrf的防范
@atian25 正解,另外这是eggjs作者
谢谢各位大佬 解决了。 不是关闭csfr, 而是让api接口不开启csrf 希望帮到大家
exports.security = {
csrf: {
// 判断是否需要 ignore 的方法,请求上下文 context 作为第一个参数
ignore: ctx => {
if (ctx.request.url == 'ctx.request.url == '/alipay/alipayNotify' || ctx.request.url == '/weixinpay/weixinpayNotify') {
return true;
}else if(ctx.request.url.indexOf('/api')!=-1){
return true;
}else{
return false;
}
}
},
domainWhiteList: [ 'http://localhost:8080' ]
};
为什么要忽略了,这样就防不了 csrf 攻击了。
@atian25 前后端分离的项目,vue直接给服务器post数据 ,没法获取csrf,官方给的例子是服务器直接渲染的,然后ajax请求携带csrf。
不知道前后端分离的项目中有没有更好的方案。
现在后端用了 egg-cors 以及配置api接口不开启csrf验证
嗯,不同域的话,那就关掉或忽略 csrf 即可。
@gougou168 你的处理方式是对的
建议再加上jwt和接口权限校验~
@atian25 不同域的话,那就关掉或忽略 csrf 即可。
但是同域情况下,服务端直接开启 <禁止跨域请求> 不就可以了吗? (请教下大佬,我这方面了解的不多) 如果这样 csrf 该在什么场景下用呢?
@abiuDoIT 如何个『禁止跨域请求』法?
@atian25 cors 默认是禁止的,要开启才接受跨域请求 默认就是 『禁止跨域请求』的吧
@abiuDoIT cors 是浏览器来裁定的,如果我直接写一个 node http request 是不受限制的
@atian25 是的,但是 csrf 攻击不就是只能在浏览器上才能发生的动作吗?
@abiuDoIT 你可以理解为,不允许第三方直接请求 AJAX 接口,只允许我们自己的页面来发起。具体看对应文档吧
@atian25 我再重新描述下我的问题好了
- 同域情况下,禁止cors 的话,就禁止了所有来自其他页面的浏览器请求,那这样不就可以杜绝 csrf 攻击了吗?
2.不同域下,又不适合开启 csrf 防御. 那 csrf 防御什么场景开启合适呢?
@atian25 😂😂🤦🏻♂️ 打扰大佬了,告辞.
(原来 禁止cors, 并不能禁止 form 表单的跨域请求,所以不能杜绝csrf 无感知攻击.)