FlawOpen

flawopen.com/Referenz/Next.js Server Actions CSRF

CSRF bei Next.js Server Actions: Origin-Prüfung und sichere Konfiguration

CWE-352: Cross-Site Request Forgery (CSRF)Framework-Sicherheitsleitfaden
Kurzantwort

Next.js Server Actions verwenden POST und vergleichen den Host von Origin mit x-forwarded-host oder host. Das ist wie die Prüfung, ob die Einladung des Besuchers denselben Veranstaltungsort nennt, den der Server erwartet. Das hilft gegen seitenübergreifende Übermittlungen, ist aber keine Autorisierung: Jede Aktion muss den Benutzer authentifizieren, Eingaben prüfen und Berechtigungen kontrollieren.

Eine Grenze ist wichtig: Laut aktueller Next.js-Dokumentation wird eine Anfrage ohne Origin mit einer Warnung zugelassen. Reverse-Proxys beeinflussen außerdem den verglichenen Host. Behandeln Sie diese Prüfung als eine Schutzschicht und lassen Sie den Proxy einen vertrauenswürdigen Host festlegen.

Origin
Vom Browser übermittelte Herkunft der auslösenden Seite; Next.js vergleicht ihren Host mit dem Anwendungshost.
Host / X-Forwarded-Host
Host-Wert für den Vergleich. Der Proxy muss weitergeleitete Angaben festlegen oder validieren.
allowedOrigins
Explizite Liste zusätzlicher Origin-Hosts, die Server Actions akzeptieren. Next.js unterstützt exakte Hosts und Wildcard-Muster.
Authorization
Entscheidung pro Aktion, ob der angemeldete Benutzer diese Operation an genau diesem Objekt ausführen darf.

So funktioniert die integrierte CSRF-Prüfung von Server Actions

1

Der Browser sendet eine Server Action

Eine Server Action wird per HTTP POST aufgerufen. SameSite blockiert standardmäßig viele seitenübergreifende Übermittlungen, aber POST allein ist kein vollständiger CSRF-Schutz.

2

Next.js vergleicht die Hosts

Bei vorhandenem Origin vergleicht Next.js dessen Host mit x-forwarded-host oder host. Abweichungen werden abgelehnt, außer der Origin-Host passt zu serverActions.allowedOrigins.

3

Die Aktion setzt ihre eigene Richtlinie durch

Nach der Anfrageprüfung muss die Aktion den Benutzer authentifizieren, jedes Argument validieren und den Vorgang autorisieren. Aktionskennungen und verborgene Formularfelder steuern keinen Zugriff.

Wichtige Grenzen: fehlender Origin und allowedOrigins

Laut Dokumentation wird ein fehlender Origin nicht standardmäßig abgelehnt

Die aktuelle Dokumentation sagt, dass Anfragen ohne Origin mit Warnung fortgesetzt werden. Gehen Sie nicht davon aus, dass jede Anfrage den Vergleich bestanden hat. Untersuchen Sie das Fehlen und authentifizieren, autorisieren und validieren Sie weiterhin in der Aktion.

Wildcards erweitern die Menge vertrauenswürdiger Origins

allowedOrigins erlaubt exakte Hosts und Wildcards: * steht für ein Label, ** für eines oder mehrere. Erlauben Sie nur benötigte Domains und Subdomains, die Ihre Organisation kontrolliert. Eine Wildcard über benutzergesteuerte Subdomains kann einem Origin außerhalb Ihrer Kontrolle vertrauen.

Konfigurieren Sie den Reverse-Proxy als Teil der Sicherheitsgrenze

Next.js verwendet x-forwarded-host oder host für den Vergleich. Der Edge-Proxy muss vom Client gelieferte Forwarding-Header verwerfen und den Wert aus einem validierten öffentlichen Hostnamen setzen; die Anwendung darf nur über diesen vertrauenswürdigen Proxy erreichbar sein. Leitet der Proxy seinen internen Host weiter, konfigurieren Sie nur den erforderlichen öffentlichen Origin in allowedOrigins. Beheben Sie Abweichungen nicht durch Vertrauen in beliebige Hosts.

ZU WEITREICHENDES VERTRAUEN
// Every subdomain, including delegated or tenant-controlled names, is trusted.
module.exports = {
  experimental: {
    serverActions: {
      allowedOrigins: ['**.example.com'],
    },
  },
};
ENG BEGRENZTES VERTRAUEN
// Add only the public host that this deployment requires.
module.exports = {
  experimental: {
    serverActions: {
      allowedOrigins: ['admin.example.com'],
    },
  },
};

// Configure the edge to overwrite X-Forwarded-Host
// with the validated public hostname.

Host-Advisories: verwandtes Risiko, getrennt von CSRF

Host-Vertrauen verursachte dokumentierte SSRF-Schwachstellen in Server Actions. CVE-2024-34351 betraf selbst gehostete Versionen vor 14.1.1, wenn eine Aktion zu einem relativen, mit / beginnenden Pfad umleitete und der Host-Header änderbar war. Ein separates Vercel-Advisory vom Juli 2026 beschreibt SSRF und mögliche Offenlegung interner Werte, wenn benutzerdefinierte Server Host-Header vom Client kontrollieren lassen; als behobene Versionen nennt es 15.5.21 und 16.2.11. Dies sind Host-Vertrauensfehler, kein Beleg für eine Umgehung des Origin-CSRF-Vergleichs.

Aktualisieren Sie für das Advisory von 2026 auf eine behobene Version. Bis dahin müssen Host und X-Forwarded-Host am Edge oder Proxy festgelegt oder validiert werden. Das Advisory dokumentiert __NEXT_PRIVATE_ORIGIN ab Version 14.2.0 als zusätzliche Übergangslösung. Prüfen Sie vor ihrer Nutzung die betroffenen und unterstützten Release-Zweige im Advisory.

Autorisieren und validieren Sie jede Server Action

Laut Next.js-Dokumentation sind Argumente als nicht vertrauenswürdig zu behandeln und muss jede Aktion prüfen, ob der aktuelle Benutzer sie aufrufen darf. Das unsichere Beispiel vertraut der vom Aufrufer gelieferten Objekt-ID. Das sichere Muster authentifiziert, validiert die Kennung und prüft Eigentümerschaft direkt in der Datenbankmutation.

OBJEKTAUTORISIERUNG FEHLT
"use server";

export async function deleteInvoice(invoiceId: string) {
  await db.invoice.delete({ where: { id: invoiceId } });
}
AUTHENTIFIZIEREN, PRÜFEN, AUTORISIEREN
"use server";

import { z } from "zod";
import { requireUser } from "@/auth";

const invoiceIdSchema = z.string().uuid();

export async function deleteInvoice(rawId: unknown) {
  const user = await requireUser();
  const invoiceId = invoiceIdSchema.parse(rawId);
  const result = await db.invoice.deleteMany({
    where: { id: invoiceId, ownerId: user.id },
  });
  if (result.count !== 1) throw new Error("Forbidden");
}

Checkliste für CSRF und Autorisierung bei Server Actions

Referenzen

Siehe auch Cross-Site Request Forgery (CSRF, CWE-352): Funktionsweise und Schutz — flawopen.com Ersetzt SameSite=Strict CSRF-Token? CSRF-Token bei GET: Wann ist es nötig? JWT im localStorage vs. HttpOnly-Cookies: Was ist sicherer? — flawopen.com