csrf的cookie验证问题
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 }
https://cnodejs.org/topic/6148a66efe0c51a586aeab22#614a8c61fe0c518d46aeabd8
没太看懂你想问啥
@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的值那也是一直通过验证,感觉和没验证一样,没理解这里