flawopen.com/Referencia/Next.js Server Actions CSRF
CSRF en Next.js Server Actions: comprobaciones Origin y configuración segura
Las Server Actions de Next.js usan POST y comparan el host de Origin con x-forwarded-host o host. Es como comprobar que la invitación del visitante indica el mismo lugar que espera el servidor. Esto ayuda a bloquear envíos entre sitios, pero no autoriza la operación: cada acción debe autenticar al usuario, validar los datos y comprobar permisos.
Hay un límite importante: la documentación actual indica que una solicitud sin Origin pasa con una advertencia. Los proxies inversos también influyen en el host comparado. Trata esta comprobación como una capa y configura el proxy para establecer un host confiable.
- Origin
- Origen de la página iniciadora, enviado por el navegador; Next.js compara su host con el de la aplicación.
- Host / X-Forwarded-Host
- Valor de host que Next.js usa en la comparación. El proxy debe establecer o validar los datos reenviados.
- allowedOrigins
- Lista explícita de hosts Origin adicionales aceptados por Server Actions. Next.js admite hosts exactos y patrones comodín.
- Authorization
- Decisión por acción que confirma que el usuario autenticado puede realizar esta operación sobre este objeto concreto.
Cómo funciona la comprobación CSRF integrada de Server Actions
El navegador envía una Server Action
Una Server Action se invoca mediante HTTP POST. El comportamiento SameSite de las cookies bloquea muchos envíos entre sitios por defecto, pero POST por sí solo no es una defensa CSRF completa.
Next.js compara los hosts
Si existe Origin, Next.js compara su host con x-forwarded-host o host. Rechaza la discrepancia, salvo que el host Origin coincida con serverActions.allowedOrigins.
La acción aún aplica su propia política
Tras validar la solicitud, la acción debe autenticar al usuario, validar cada argumento y autorizar la operación. Los identificadores de acción y los campos ocultos no controlan el acceso.
Límites importantes: Origin ausente y allowedOrigins
La documentación actual dice que las solicitudes sin Origin continúan con una advertencia. No supongas que todas superaron la comparación. Investiga la ausencia y autentica, autoriza y valida siempre dentro de la acción.
allowedOrigins acepta hosts exactos y comodines: * representa una etiqueta y **, una o más. Permite solo dominios y subdominios controlados por tu organización y necesarios. Un comodín que abarque subdominios controlados por usuarios puede confiar en un origen fuera de tu control.
Configura el proxy inverso como parte del límite de seguridad
Next.js usa x-forwarded-host o host para comparar. El proxy perimetral debe descartar los encabezados reenviados del cliente y establecer el valor a partir de un nombre público validado; la aplicación solo debe ser accesible mediante ese proxy confiable. Si el proxy reenvía su host interno, configura únicamente el origen público necesario en allowedOrigins. No resuelvas la discrepancia confiando en hosts arbitrarios.
// Every subdomain, including delegated or tenant-controlled names, is trusted.
module.exports = {
experimental: {
serverActions: {
allowedOrigins: ['**.example.com'],
},
},
};
// 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.
Avisos sobre Host: riesgo relacionado, distinto de CSRF
La confianza en Host ha causado fallos documentados de SSRF en Server Actions. CVE-2024-34351 afectó a versiones autoalojadas anteriores a 14.1.1 cuando una acción hacía una redirección relativa iniciada por / y se podía modificar Host. Un aviso de Vercel de julio de 2026 describe SSRF y posible exposición de valores internos cuando servidores personalizados dejan que el cliente controle encabezados asociados al host; indica versiones corregidas 15.5.21 y 16.2.11. Son fallos de confianza en Host, no una prueba de que se eluda la comprobación Origin contra CSRF.
Para el aviso de 2026, actualiza a una versión corregida. Mientras tanto, fija o valida Host y X-Forwarded-Host en el proxy o perímetro. El aviso también documenta __NEXT_PRIVATE_ORIGIN como alternativa adicional desde la versión 14.2.0. Confirma las ramas afectadas y compatibles en el aviso antes de usarla.
Autoriza y valida cada Server Action
La documentación de Next.js indica que los argumentos deben tratarse como hostiles y que cada acción debe comprobar si el usuario puede invocarla. El ejemplo vulnerable confía en el ID de objeto enviado por el cliente. El patrón corregido autentica, valida el identificador y aplica la propiedad en la propia mutación de base de datos.
"use server";
export async function deleteInvoice(invoiceId: string) {
await db.invoice.delete({ where: { id: invoiceId } });
}
"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");
}
Lista de comprobación: CSRF y autorización en Server Actions
- ✓En el proxy, rechaza hosts públicos desconocidos y sustituye
Host/X-Forwarded-Hostdel cliente por valores validados. - ✓Deja
allowedOriginsvacío salvo que un proxy o varias orígenes lo requieran; permite solo hosts controlados con el patrón más restrictivo. - ✓En cada Server Action, autentica al usuario, valida argumentos en tiempo de ejecución y autoriza el objeto o la operación concretos.
- ✓Trata la falta de
Origincomo una anomalía registrada que investigar; la advertencia del framework no decide permisos. - ✓Audita Route Handlers personalizados por separado: no heredan la comprobación Origin. Implementa y prueba una defensa CSRF apropiada para mutaciones autenticadas mediante cookies.
- ✓Sigue los avisos de seguridad de Next.js y actualiza las implementaciones afectadas, en especial servidores personalizados que acepten encabezados de host del cliente.
Referencias
- Next.js Docs — serverActions y allowedOrigins
- Next.js — Cómo pensar en la seguridad de Next.js
- Aviso de Vercel — CVE-2024-34351: SSRF en Server Actions
- Aviso de Vercel — GHSA-89xv-2m56-2m9x: SSRF en servidores personalizados (julio de 2026)
- CWE-352 — Falsificación de petición entre sitios (CSRF)
- CWE-918 — Falsificación de solicitud del lado del servidor (SSRF)