Сервис развивается: тестируем формат, собираем идеи, улучшаем сервис. Есть идеи? Написать
Дайджесты новостей
Схема единого серверного слоя с защищёнными cookie, CSRF-защитой и загрузкой файлов для двух адаптеров.

NestJS 12.1.0: встроенные cookie-адаптеры, защита от CSRF и загрузка файлов под Fastify

Экосистема серверного TypeScript-фреймворка NestJS получила плановое функциональное обновление: состоялся релиз NestJS 12.1.0. Версия направлена на усиление встроенной безопасности, упрощение микросервисной маршрутизации и устранение функционального неравенства между адаптерами Express и Fastify.

Одновременно с минорным релизом двенадцатой ветки команда опубликовала корректирующий патч безопасности NestJS 11.2.6 для проектов, остающихся на предыдущей мажорной версии.

Исторически работа с HTTP-куками и заголовками межсайтовой подделки запросов (CSRF) в NestJS требовала ручного подключения внешних middleware: пакета cookie-parser для Express или плагина @fastify/cookie для Fastify. Это приводило к дублированию настроек, усложняло переносимость контроллеров между адаптерами и требовало от разработчиков постоянного внимания к тонкостям парсинга заголовков Set-Cookie.

В NestJS 12.1.0 управление сессионными cookie вынесено в ядро фреймворка (@nestjs/common и @nestjs/core). Новые интерфейсы функционируют поверх единого абстрактного уровня HTTP-адаптера: теперь чтение, подпись и установка защищенных параметров HttpOnly, Secure и SameSite не зависят от того, какой базовый сервер обрабатывает трафик.

Вторым важным улучшением стала нативная поддержка защиты от CSRF-атак и базовая конфигурация заголовков безопасности прямо из коробки, без необходимости привлекать сторонние библиотеки вроде csurf.

Кроме того, метод app.setGlobalPrefix() научился принимать массив строк. Это упрощает маршрутизацию в сложных архитектурах: например, при одновременной поддержке префиксов версионирования ['api/v1', 'api/v2'] или изоляции публичных и внутренних эндпоинтов на уровне одного приложения.

Ниже показана инициализация приложения на базе Fastify с массивом префиксов и нативным управлением cookie:

// main.ts — запуск приложения с Fastify-адаптером в NestJS 12.1.0
import { NestFactory } from '@nestjs/core';
import { FastifyAdapter, NestFastifyApplication } from '@nestjs/platform-fastify';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create<NestFastifyApplication>(
    AppModule,
    new FastifyAdapter()
  );

  // Поддержка массива глобальных префиксов маршрутов
  app.setGlobalPrefix(['api/v1', 'api/v2']);

  // Встроенная активация адаптер-независимой защиты
  app.enableCors({ credentials: true });

  await app.listen(3000, '0.0.0.0');
}
bootstrap();

Паритет Fastify: перехватчики загрузки файлов

Долгое время ключевым аргументом в пользу выбора более медленного Express вместо высокопроизводительного Fastify оставалась простота обработки составных форм (multipart form data). Декораторы @UseInterceptors(FileInterceptor('file')) исторически опирались на библиотеку multer, тесно связанную с Express. Пользователям Fastify приходилось писать кастомные пайпы или напрямую разбирать сырые потоки @fastify/multipart.

В версии 12.1.0 модуль @nestjs/platform-fastify получил полноценные штатные интерцепторы загрузки файлов, полностью совместимые с @fastify/multipart. Разработчики могут использовать привычный декларативный синтаксис контроллеров с гарантией высокой скорости разбора потоков.

Второй блок кода иллюстрирует контроллер, объединяющий загрузку файла под Fastify и безопасную установку сессионных cookie:

// upload.controller.ts — обработка файлов и cookie в NestJS 12.1.0
import { Controller, Post, UseInterceptors, UploadedFile, Res, HttpStatus } from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-fastify';
import type { FastifyReply } from 'fastify';

@Controller('documents')
export class UploadController {
  @Post('avatar')
  @UseInterceptors(FileInterceptor('avatar', { limits: { fileSize: 2 * 1024 * 1024 } }))
  async uploadAvatar(
    @UploadedFile() file: any,
    @Res({ passthrough: true }) response: FastifyReply
  ) {
    // Встроенный адаптер-независимый вызов установки cookie
    response.setCookie('last_upload_status', 'success', {
      httpOnly: true,
      secure: true,
      sameSite: 'strict',
      path: '/',
    });

    return {
      status: HttpStatus.OK,
      filename: file.filename,
      size: file.file.bytesRead,
    };
  }
}

Безопасность ветки 11.x: CVE-2026-88932 в multer

Параллельно с выпуском 12.1.0 команда NestJS выпустила версию 11.2.6 для поддержки предыдущей ветки. Это критическое обновление безопасности: в зависимой библиотеке multer была устранена уязвимость CVE-2026-88932, связанная с некорректным разбором границ полей и потенциальным отказом в обслуживании при передаче специально сформированных заголовков формы.

Патч 11.2.6 принудительно обновляет зависимость multer до защищенной версии 2.4.0. Кроме того, инженеры исправили маппинг ошибок загрузчика: если клиент отправляет неожиданное имя поля формы, сервер теперь корректно возвращает клиентскую ошибку 400 Bad Request вместо аварийного завершения обработчика с кодом 500 Internal Server Error.

Порядок обновления зависимостей

Для проектов на ветке NestJS 11.x обновление до 11.2.6 является обязательным с точки зрения безопасности. При обновлении зафиксируйте версию пакетов в package-lock.json или pnpm-lock.yaml, выполните проверку прогона интеграционных тестов загрузки файлов и убедитесь, что обработчики ошибок клиентских форм ожидают статус 400 вместо 500 при невалидных полях.

Релиз NestJS 12.1.0 делает фреймворк более самодостаточным, сокращая зависимость от разрозненных внешних middleware и предоставляя единый стандарт безопасности и загрузки данных независимо от выбранного серверного движка.