egg icon indicating copy to clipboard operation
egg copied to clipboard

csrf的cookie验证问题

Open ugvgylkm opened this issue 4 years ago • 2 comments

config.security配置里配置了cookie名称为csrfToken,前端ajax请求带入了cookie为csrfToken的值,这种情况egg-security里面这行代码 if (token !== this[CSRF_SECRET] && !tokens.verify(this[CSRF_SECRET], token)) { 判断一直为false,结果就是一直通过,前端随便改cookie名为csrfToken的值也是一直通过验证,那这个验证还有啥作用,这里没有理解,请帮忙解释下。

  • [x] egg配置文件

config.security = { domainWhiteList: ['.xxx.com'], csrf: { enable: true, // 默认为 false,当设置为 true 时,将会放过所有 content-type 为 application/json 的请求 ignoreJSON: false, // 默认为 false,当设置为 true 时,将会把 csrf token 保存到 Session 中 useSession: false, // Cookie 中的字段名,默认为 csrfToken cookieName: 'csrfToken', // Session 中的字段名,默认为 csrfToken sessionName: 'csrfToken', headerName: 'x-csrf-token', bodyName: '_csrf', queryName: '_csrf', }, };

  • [x] egg-security包源码

[email protected]@egg-security\app\extend\context.js

CSRF_CTOKEN_CHECK { if (!this[CSRF_SECRET]) { debug('missing csrf token'); this[LOG_CSRF_NOTICE]('missing csrf token'); return 'missing csrf token'; } const token = this[INPUT_TOKEN]; // AJAX requests get csrf token from cookie, in this situation token will equal to secret // synchronize form requests' token always changing to protect against BREACH attacks if (token !== this[CSRF_SECRET] && !tokens.verify(this[CSRF_SECRET], token)) { debug('verify secret and token error'); this[LOG_CSRF_NOTICE]('invalid csrf token'); return 'invalid csrf token'; } },

  • [x] 前台ajax请求

$.ajax({ url: url.xxx, // egg 后台地址 type: 'POST', data: { userid: vars.userid, _csrf: util.getCookie('csrfToken') //配置里csrf cookie }

ugvgylkm avatar Sep 24 '21 11:09 ugvgylkm

https://cnodejs.org/topic/6148a66efe0c51a586aeab22#614a8c61fe0c518d46aeabd8

没太看懂你想问啥

atian25 avatar Sep 24 '21 14:09 atian25

@atian25 egg开启了csrf,前台ajax带入了cookie的csrfToken的值, 如下这行代码是csrf的验证代码,

if (token !== this[CSRF_SECRET] && !tokens.verify(this[CSRF_SECRET], token)) //[email protected]@egg-security\app\extend\context.js。

这里验证逻辑是cookie的csrfToken值和ajax传过来的csrfToken值做校验,那这里代码(token !== this[CSRF_SECRET] )执行为false,等于一直通过了验证,前端随便改cookie csrfToken的值那也是一直通过验证,感觉和没验证一样,没理解这里

ugvgylkm avatar Sep 25 '21 12:09 ugvgylkm