eggjs / egg

🥚 Born to build better enterprise frameworks and apps with Node.js & Koa
https://eggjs.org
MIT License
18.9k stars 1.82k forks source link

在通过form进行操作表单进行页面跳转时候,一直报403!invalid csrf token!到底是怎么回事? #2159

Closed hongjinquan closed 6 years ago

hongjinquan commented 6 years ago

通过form表单进行验证登陆时,一直报403错误,说是csrf token不合法,请帮忙看一下!到底啥什么问题!

config.security = {
        csrf: {
            ignoreJSON: false,
        },
        domainWhiteList: [ 'http://localhost:7001' ],
    };
    config.cors = {
        origin: '*',
        allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH,OPTIONS',
        credentials: true,
    };
// 通过点击界面的提交按钮提交到/manage/verify,进行验证时报403错误
async verify() {
        const { ctx } = this;
        const { verify } = ctx.request.body;
        if (!verify || Util.md52(verify, 'hex') === '*****') {
              // 设置session
            ctx.session.verify = verify;
            ctx.session.maxAge = 30 * 60 * 1000;
            // 重定向到manage
        } 
           ctx.redirect('/manage');
    }
2018-03-16 17:33:02,925 WARN 23400 [-/10.0.4.200/-/834ms POST /manage/verify] invalid csrf token. See https://eggjs.org/zh-cn/core/security.html#安全威胁csrf的防范
2018-03-16 17:33:02,928 WARN 23400 [-/10.0.4.200/-/836ms POST /manage/verify] nodejs.ForbiddenError: invalid csrf token
    at Object.throw (/mnt/hgfs/hyyjserver/node_modules/koa/lib/context.js:92:11)
    at Object.assertCsrf (/mnt/hgfs/hyyjserver/node_modules/egg-security/app/extend/context.js:148:17)
    at csrf (/mnt/hgfs/hyyjserver/node_modules/egg-security/lib/middlewares/csrf.js:31:9)
    at dispatch (/mnt/hgfs/hyyjserver/node_modules/koa-compose/index.js:42:32)
    at /mnt/hgfs/hyyjserver/node_modules/koa-compose/index.js:34:12
    at dispatch (/mnt/hgfs/hyyjserver/node_modules/koa-compose/index.js:42:32)
    at next (/mnt/hgfs/hyyjserver/node_modules/koa-compose/index.js:43:18)
    at session (/mnt/hgfs/hyyjserver/node_modules/koa-session/index.js:41:13)
    at dispatch (/mnt/hgfs/hyyjserver/node_modules/koa-compose/index.js:42:32)
    at next (/mnt/hgfs/hyyjserver/node_modules/koa-compose/index.js:43:18)
    at overrideMethod (/mnt/hgfs/hyyjserver/node_modules/koa-override/index.js:38:12)
    at dispatch (/mnt/hgfs/hyyjserver/node_modules/koa-compose/index.js:42:32)
    at next (/mnt/hgfs/hyyjserver/node_modules/koa-compose/index.js:43:18)
    at bodyParser (/mnt/hgfs/hyyjserver/node_modules/koa-bodyparser/index.js:86:11)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:188:7)
message: 'invalid csrf token'
headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': 'true' }
pid: 23400
hostname: localhost.localdomain
hongjinquan commented 6 years ago

@atian25 急急急,请大神帮忙看一下!

atian25 commented 6 years ago

你 ajax 那边没带上 csrf 的原因吧。 如果不在乎这个的话,那就 csrf: false

hongjinquan commented 6 years ago

@atian25 我是通过直接通过form提交的post请求,根据文档在ejs模板中添加了

 <input type="hidden" name="_csrf" value="{{ctx.csrf}}" />

也没有生效。

AnyGong commented 6 years ago

我刚好碰到这个问题,看了之前的issu配合文档解决了。解决方案很多,不知道你适合哪种。(建议遇到疑问,可以关键字先搜索一下issu是否有解答,然后再配合文档,会找到答案的。鄙人菜鸟一枚。。。)

atian25 commented 6 years ago

最好直接加到 url 上,不用放到 hidden

hongjinquan commented 6 years ago

@atian25 放到url上也没生效。我是通过路由控制然后判断条件,符合条件后进行重定向了。

hongjinquan commented 6 years ago

@AnyGong 我是通过路由控制然后判断条件,符合条件后进行重定向了。你是怎么解决的!我看了issue没找到相关的解决方案。

mwang0 commented 6 years ago

我也刚好碰到这个问题。 security中的domainWhiteList 好像没有作用似的,不知是不是没有正确使用。

不过在看egg-security文档时,发现了解决了这个问题的办法。 解决方案1:关闭csrf验证

config.security = {
    csrf: { enable:true}
}

解决方案2:忽略白名单的csrf验证

config.security = {
   domainWhiteList: ['http://localhost:8080'],
   ignore:ctx=>{
        const domainWhiteList = ctx.app.config.security.domainWhiteList
        return domainWhiteList.indexOf(ctx.request.headers.origin) != -1
      }
}
hongjinquan commented 6 years ago
        嗯嗯。改用token了。后边再试一下。谢谢咯。

                                邮箱:945338022@qq.com

签名由 网易邮箱大师 定制 在2018年03月26日 16:00,NULL 写道: 我也刚好碰到这个问题。 security中的domainWhiteList 好像没有作用似的,不知是不是没有正确使用。 不过在看egg-security文档时,发现了解决了这个问题的办法。 解决方案1:关闭csrf验证 config.security = { csrf: { enable:true} }

解决方案2:忽略白名单的csrf验证 config.security = { domainWhiteList: ['http://localhost:8080'], ignore:ctx=>{ const domainWhiteList = ctx.app.config.security.domainWhiteList return domainWhiteList.indexOf(ctx.request.headers.origin) != -1 } }

—You are receiving this because you authored the thread.Reply to this email directly, view it on GitHub, or mute the thread.

{"api_version":"1.0","publisher":{"api_key":"05dde50f1d1a384dd78767c55493e4bb","name":"GitHub"},"entity":{"external_key":"github/eggjs/egg","title":"eggjs/egg","subtitle":"GitHub repository","main_image_url":"https://cloud.githubusercontent.com/assets/143418/17495839/a5054eac-5d88-11e6-95fc-7290892c7bb5.png","avatar_image_url":"https://cloud.githubusercontent.com/assets/143418/15842166/7c72db34-2c0b-11e6-9aed-b52498112777.png","action":{"name":"Open in GitHub","url":"https://github.com/eggjs/egg"}},"updates":{"snippets":[{"icon":"PERSON","message":"@mwang0 in #2159: 我也刚好碰到这个问题。 \r\nsecurity中的domainWhiteList 好像没有作用似的,不知是不是没有正确使用。\r\n\r\n不过在看egg-security文档时,发现了解决了这个问题的办法。 \r\n解决方案1:关闭csrf验证\r\n\r\nconfig.security = {\r\n csrf: { enable:true}\r\n}\r\n\r\n\r\n解决方案2:忽略白名单的csrf验证\r\n\r\nconfig.security = {\r\n domainWhiteList: ['http://localhost:8080'],\r\n ignore:ctx=\u003e{\r\n const domainWhiteList = ctx.app.config.security.domainWhiteList\r\n return domainWhiteList.indexOf(ctx.request.headers.origin) != -1\r\n }\r\n}\r\n"}],"action":{"name":"View Issue","url":"https://github.com/eggjs/egg/issues/2159#issuecomment-376078988"}}}