
Образовательная демонстрация уязвимости подделки серверных запросов (SSRF) в Next.js (CVE-2024-34351), с пошаговыми примерами эксплуатации и смягчения.
Этот репозиторий может служить материалом для одного или нескольких митапов. Маршрут следующий...
Эта работа основана в основном на двух источниках:
1-csr-load-data — загрузка данных в vanilla React SPA[!IMPORTANT] CSR (Client-Side Rendering): код React доставляется в браузер, который генерирует контент, вставляемый в DOM.

cd 1-csr-load-data
npm start

2-csr-router — маршрутизация в vanilla React SPA[!IMPORTANT] После первой загрузки страницы навигация по другим страницам того же сайта использует JavaScript для повторного рендеринга частей страницы без полной перезагрузки.
cd 2-csr-router
npm start

3-rsc-load-data — загрузка данных в React Server Components (реализация Next.js)[!IMPORTANT] Компоненты React, предназначенные для выполнения только на сервере, а не в браузере.

cd 3-rsc-load-data
npm run build
npm run start

4-rsc-router — маршрутизация в React Server Components (реализация Next.js)[!IMPORTANT] Компоненты выполняются только на сервере. Поведение по умолчанию — статический рендеринг: компоненты выполняются на этапе сборки.
cd 4-rsc-router
npm run build
npm run start

5-SSR — SSR (Server Side Rendering)[!IMPORTANT] SSR означает предварительный рендеринг клиентских компонентов на сервере. Код React выполняется в момент запроса. Результат может кешироваться для последующих запросов.
Рекомендация: определять компоненты с 'use client'; как можно ниже в дереве компонентов.
[!IMPORTANT] «В React „гидратация“ — это то, как React „прикрепляется“ к существующему HTML, который уже был отрисован React в серверной среде. Во время гидратации React пытается прикрепить обработчики событий к существующей разметке и взять на себя рендеринг приложения на клиенте. В приложениях, полностью построенных на React, обычно гидратируется только один „корень“, один раз при запуске всего приложения.»
https://react.dev/reference/react-dom/client/hydrateRoot
https://www.gatsbyjs.com/docs/conceptual/partial-hydration/
cd 5-ssr
npm run build
npm run start

6-pages-router-ssg (реализация Next.js)[!IMPORTANT] SSG (Static Site Generation) с использованием pages router: код React выполняется при сборке приложения, а сгенерированный вывод статичен.
cd 6-pages-router-ssg
npm run build
npm run start
7-pages-router-isr (реализация Next.js)[!IMPORTANT] ISR (с использованием pages router): «Next.js позволяет создавать или обновлять статические страницы после сборки сайта. Инкрементальная статическая регенерация (ISR) позволяет использовать статическую генерацию для каждой страницы без необходимости пересобирать весь сайт. С ISR можно сохранить преимущества статики, масштабируясь до миллионов страниц.»
cd 7-pages-router-isr
npm run build
npm run start
«данные могут устареть во время запроса»
https://vercel.com/blog/nextjs-server-side-rendering-vs-static-generation
https://react.dev/reference/rsc/server-actions
...
8-ssrf-14.1.0https://www.assetnote.io/resources/research/digging-for-ssrf-in-nextjs-apps
14.1.1redirect(\/blog/${inputValue}`);`