Код-ревью Middle CSRF, SameSite и CORS обновлено

Ревью: настройки Express и маршрут перевода

Вопрос

Найдите проблемы, связанные с CSRF, CORS и cookie.

app.use(cors({ origin: (origin, cb) => cb(null, true), credentials: true }));
app.use(session({
  secret: process.env.SESSION_SECRET,
  cookie: { httpOnly: true, secure: true, sameSite: 'none' },
}));

app.get('/api/transfer', requireLogin, async (req, res) => {
  await transfer(req.session.userId, req.query.to, Number(req.query.amount));
  res.json({ ok: true });
});

Коротко

Каждая настройка по отдельности частая ошибка, вместе они дают полный CSRF и кражу данных через CORS. Исправление: allowlist origin, SameSite=Lax, POST с CSRF-токеном, валидация входа.

Что должен найти ревьюер

  1. Безопасностьстрока 1
    CORS отражает любой origin с credentials: любой сайт прочитает ответы API от имени пользователя. Нужен точный allowlist.
  2. Безопасностьстрока 4
    sameSite: 'none' без необходимости: cookie уходит на все межсайтовые запросы, CSRF открыт. Для обычного приложения нужен Lax или Strict.
  3. Безопасностьстрока 7
    Перевод денег через GET: срабатывает по ссылке и при навигации, не защищается Lax. Нужен POST.
  4. Безопасностьстрока 7
    Нет CSRF-токена или проверки Origin для изменяющего действия.
  5. Ошибкастрока 8
    Сумма не валидируется: Number даст NaN или отрицательное значение.

Разбор

Каждая настройка по отдельности частая ошибка, вместе они дают полный CSRF и кражу данных через CORS. Исправление: allowlist origin, SameSite=Lax, POST с CSRF-токеном, валидация входа.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме