csrf的cookie验证问题
- Dominant language
- TypeScript
- Stars
- 19k
- Forks
- 1.8k
- PR merge metrics
- No merged PRs in 30d
Description
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包源码
\_egg-security@2.9.0@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
> }
>
Contributor guide
Assessment
This issue has not been assessed yet.