FlawOpen

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

CSRF en Next.js Server Actions: comprobaciones Origin y configuración segura

CWE-352: Cross-Site Request Forgery (CSRF)Guía de seguridad del framework
Respuesta breve

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

1

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.

2

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.

3

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 ausencia de Origin no se rechaza según el comportamiento documentado

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.

Los comodines amplían el conjunto de orígenes de confianza

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.

CONFIANZA AMPLIA
// Every subdomain, including delegated or tenant-controlled names, is trusted.
module.exports = {
  experimental: {
    serverActions: {
      allowedOrigins: ['**.example.com'],
    },
  },
};
CONFIANZA LIMITADA
// 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.

SIN AUTORIZACIÓN DEL OBJETO
"use server";

export async function deleteInvoice(invoiceId: string) {
  await db.invoice.delete({ where: { id: invoiceId } });
}
AUTENTICAR, VALIDAR, AUTORIZAR
"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

Referencias

Véase también Cross-Site Request Forgery (CSRF, CWE-352): cómo funciona y cómo evitarlo — flawopen.com ¿SameSite=Strict sustituye los tokens CSRF? Token CSRF en GET: ¿cuándo se necesita? JWT en localStorage frente a cookies HttpOnly: ¿qué es más seguro? — flawopen.com