egg.js中实现RESTfull api,vue请求post数据提示 missing csrf token
发布于 5 个月前 作者 gougou168 1716 次浏览 来自 问答

egg.js中实现RESTfull api,vue请求post数据提示 missing csrf token

2.png

20 回复

请求的时候,需要把 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 我再重新描述下我的问题好了

  1. 同域情况下,禁止cors 的话,就禁止了所有来自其他页面的浏览器请求,那这样不就可以杜绝 csrf 攻击了吗?

2.不同域下,又不适合开启 csrf 防御. 那 csrf 防御什么场景开启合适呢?

@atian25 😂😂🤦🏻‍♂️ 打扰大佬了,告辞.

(原来 禁止cors, 并不能禁止 form 表单的跨域请求,所以不能杜绝csrf 无感知攻击.)

回到顶部