Экосистема серверного TypeScript-фреймворка NestJS получила плановое функциональное обновление: состоялся релиз NestJS 12.1.0. Версия направлена на усиление встроенной безопасности, упрощение микросервисной маршрутизации и устранение функционального неравенства между адаптерами Express и Fastify.
Одновременно с минорным релизом двенадцатой ветки команда опубликовала корректирующий патч безопасности NestJS 11.2.6 для проектов, остающихся на предыдущей мажорной версии.
Архитектурная независимость: встроенные cookie и CSRF
Исторически работа с 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 и предоставляя единый стандарт безопасности и загрузки данных независимо от выбранного серверного движка.
