Lusca csrf не работает должным образом - HTTP-запрос с использованием старого токена - PullRequest
1 голос
/ 25 марта 2020

Я пытался настроить защиту CSRF с помощью lusca в моем приложении Express. js. Не выглядит это так:

this.app.use(lusca({
      csrf: {
        cookie: {name: '_csrf'}
      },
      hsts: { maxAge: 31536000, includeSubDomains: true, preload: true },
      nosniff: true,
      referrerPolicy: "same-origin",
      xframe: "SAMEORIGIN",
      xssProtection: true,
    }));

А на стороне клиента:

const res = await axios.post(`${Constants.apiUrl()}/${Constants.paths.login}`, 
                credentials, {
                    withCredentials: true,
                    xsrfCookieName: '_csrf'
                });

На стороне сервера я также установил некоторые заголовки, чтобы иметь возможность отправлять куки с запросом - res.header('Access-Control-Allow-Credentials', 'true').

Возможно, мне не хватает какой-то важной части того, как работает защита CSRF. Теперь каждый раз с ответом я получаю новый csrf token, но это означает, что мой новый запрос HTTP POST отправляет предыдущий токен, который уже устарел. Чего мне не хватает?

1 Ответ

1 голос
/ 03 апреля 2020

Наконец, я нашел проблему после тестирования в течение 3 часов. Вам нужно добавить secret из csrf. Также, если вы используете Angular, вам нужно добавить angular: true в csrf.

this.app.use(lusca({
    csrf: {
        cookie: {name: '_csrf'},
        secret: 'qwerty'
    },
    hsts: { maxAge: 31536000, includeSubDomains: true, preload: true },
    nosniff: true,
    referrerPolicy: "same-origin",
    xframe: "SAMEORIGIN",
    xssProtection: true,
}));
...