
Bildungs-Repository, das Next.js-Rendering-Patterns (CSR, RSC, SSG, ISR, SSR) und ein praktisches SSRF-Exploit-Labor für CVE-2024-34351 mit Minderungsschritten demonstriert.
Dieses Repository kann als Grundlage für die Präsentation eines oder mehrerer Meetups dienen. Der Ablauf ist wie folgt…
Diese Arbeit basiert hauptsächlich auf zwei Quellen:
1-csr-load-data vanilla react SPA loading data[!IMPORTANT] CSR (Client-Side Rendering): React-Code wird an den Browser ausgeliefert, der Inhalte generiert, die in das DOM eingefügt werden.

cd 1-csr-load-data
npm start

2-csr-router vanilla react SPA routing[!IMPORTANT] Nach dem erstmaligen Laden der Seite verwendet die Navigation zu anderen Seiten derselben Website JavaScript, um Teile der Seite neu zu rendern, ohne dass ein vollständiger Seitenneuladevorgang erforderlich ist.
cd 2-csr-router
npm start

3-rsc-load-data React Server Components (Next.js-Implementierung) Laden von Daten[!IMPORTANT] React-Komponenten, die dafür geschrieben wurden, nur auf dem Server ausgeführt zu werden, nicht im Browser.

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

4-rsc-router React Server Components (Next.js-Implementierung) Routing[!IMPORTANT] Komponenten werden nur auf dem Server ausgeführt. Das Standardverhalten ist statisches Rendering: Komponenten werden zur Build-Zeit ausgeführt.
cd 4-rsc-router
npm run build
npm run start

5-SSR SSR Server Side Rendering[!IMPORTANT] SSR bedeutet, Client-Komponenten auf dem Server vorzurendern. React-Code wird zum Zeitpunkt der Anforderung ausgeführt. Das Ergebnis kann für zukünftige Anfragen zwischengespeichert werden.
Best Practice: 'use client';-Komponenten so weit unten im Komponentenbaum wie möglich definieren.
[!IMPORTANT] „In React ist „Hydration" der Vorgang, bei dem React an vorhandenes HTML „anbindet", das bereits von React in einer Serverumgebung gerendert wurde. Während der Hydration versucht React, Ereignis-Listener an das vorhandene Markup anzuhängen und die Darstellung der App auf dem Client zu übernehmen. In vollständig mit React erstellten Apps hydriert man normalerweise nur eine „Wurzel", einmal beim Start, für die gesamte App."
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-Implementierung)[!IMPORTANT] SSG (Static Site Generation) mit dem Pages Router: React-Code wird beim Erstellen der Anwendung ausgeführt, und die generierte Ausgabe ist statisch.
cd 6-pages-router-ssg
npm run build
npm run start
7-pages-router-isr (Next.js-Implementierung)[!IMPORTANT] ISR (mit Pages Router): „Next.js ermöglicht es Ihnen, statische Seiten zu erstellen oder zu aktualisieren, nachdem Sie Ihre Website erstellt haben. Incremental Static Regeneration (ISR) ermöglicht es Ihnen, Static-Generation auf Seitenbasis zu verwenden, ohne die gesamte Website neu erstellen zu müssen. Mit ISR können Sie die Vorteile von statischen Seiten beibehalten und gleichzeitig auf Millionen von Seiten skalieren."
cd 7-pages-router-isr
npm run build
npm run start
„Die Daten könnten zum Zeitpunkt der Anforderung veraltet sein"
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});Quelle: https://www.assetnote.io/resources/research/digging-for-ssrf-in-nextjs-apps
Next.JS führt die Anfrage serverseitig aus und gibt das Ergebnis an den Browser zurück:
redirect('/blog/123'); konstruiert die URL http://207.154.209.99/blog/123.
Um diese URL zu konstruieren, holt sich Next.JS unter anderem den Host 207.154.209.99 aus dem HTTP-Header der ursprünglichen Anfrage.Content-Type: text/x-component zurückgibt, fragt Next.JS die URL mit einem HTTP GET ab.Um einen SSRF auf dem Zielserver zu erreichen, muss man daher einen anderen Server ausführen:
Content-Type: text/x-component zurückgibt
8-ssrf-14.1.0In /etc/nginx/sites-available/nextjs
Vorher:
server {
listen 80 default_server;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
Nachher:
server {
listen 80;
server_name 207.154.209.99;
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host 207.154.209.99;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
Risiko von Nebeneffekten…
https://nginxtutorials.com/nginx-proxy_set_header-directive/
https://github.com/vercel/next.js/security/advisories/GHSA-fr5h-rqp8-mj6g

Seiten im App-Verzeichnis sind standardmäßig Server-Komponenten. Dies unterscheidet sich vom Pages-Verzeichnis, in dem Seiten Client-Komponenten sind.
Für das Upgrade auf Next.js 13 ist die Verwendung des neuen App Routers nicht erforderlich. Sie können weiterhin Seiten mit neuen Funktionen verwenden, die in beiden Verzeichnissen funktionieren.
Wenn man die Ladeleistung der verschiedenen Lösungen vergleichen möchte, kann man die Web Core Vital Metriken per console.log hinzufügen.
https://web.dev/articles/fcp?hl=fr
https://rsc-parser.vercel.app/
https://github.com/reactjs/rfcs/blob/main/text/0188-server-components.md#does-this-replace-ssr
https://www.youtube.com/watch?v=jEJEFAc8tSI
ISR mit App Router?
Im Next.js App Router sind alle abgerufenen Daten standardmäßig statisch, d.h. sie werden zur Build-Zeit gerendert. Dies kann jedoch leicht geändert werden: Next.js erweitert das fetch-Optionenobjekt, um Flexibilität bei Caching- und Revalidierungsregeln zu bieten. Man kann die Option
{next: {revalidate: number}}verwenden, um statische Daten in festgelegten Intervallen oder bei Backend-Änderungen zu aktualisieren (Incremental Static Regeneration), während die Option{cache: 'no-store'}in der fetch-Anfrage für dynamische Daten (Server-Side Rendering) übergeben werden kann.
https://www.telerik.com/blogs/current-state-react-server-components-guide-perplexed
https://github.com/reactjs/server-components-demo
https://dev.to/vteacher/let-s-make-a-web-application-with-react-server-components-5dmg
https://react.dev/blog/2024/04/25/react-19
https://react.dev/reference/rsc/server-components
https://www.youtube.com/watch?v=ePAPd9qzGyM
https://www.joshwcomeau.com/react/server-components/
https://nextjs.org/docs/pages/building-your-application/rendering/static-site-generation
https://nextjs.org/docs/pages/building-your-application/data-fetching/get-static-props
https://react.dev/reference/rsc/server-components#server-components-without-a-server