FlawOpen

flawopen.com/Referência/Next.js Server Actions CSRF

Next.js Server Actions contra CSRF: verificações de Origin e configuração segura

CWE-352: Cross-Site Request Forgery (CSRF)Guia de segurança do framework
Resposta curta

As Server Actions do Next.js usam POST e comparam o host de Origin com x-forwarded-host ou host. É como conferir se o convite do visitante indica o mesmo local que o servidor espera. Isso ajuda contra envios entre sites, mas não concede autorização: cada ação ainda precisa autenticar o usuário, validar entradas e verificar permissões.

Há um limite importante: a documentação atual diz que uma requisição sem Origin passa com um aviso. Proxies reversos também influenciam o host comparado. Trate a verificação como uma camada e faça o proxy definir um host confiável.

Origin
Origem informada pelo navegador da página iniciadora; o Next.js compara seu host com o host da aplicação.
Host / X-Forwarded-Host
Valor usado pelo Next.js na comparação. O proxy deve definir ou validar os dados encaminhados.
allowedOrigins
Lista explícita de hosts Origin adicionais aceitos pelas Server Actions. O Next.js aceita hosts exatos e padrões curinga.
Authorization
Decisão por ação que confirma se o usuário autenticado pode executar esta operação neste objeto específico.

Como funciona a verificação CSRF integrada das Server Actions

1

O navegador envia uma ação do servidor

Uma Server Action é chamada por HTTP POST. O comportamento SameSite dos cookies bloqueia muitos envios entre sites por padrão, mas POST sozinho não é proteção CSRF completa.

2

O Next.js compara os hosts

Com Origin presente, o Next.js compara seu host com x-forwarded-host ou host. Uma diferença é rejeitada, salvo se o host Origin corresponder a serverActions.allowedOrigins.

3

A ação ainda aplica sua própria política

Após validar a requisição, a ação deve autenticar o usuário, validar cada argumento e autorizar a operação. IDs de ação e campos ocultos de formulário não controlam acesso.

Limites importantes: Origin ausente e allowedOrigins

A ausência de Origin não é rejeitada pelo padrão documentado

A documentação atual informa que requisições sem Origin continuam com um aviso. Não presuma que todas passaram pela comparação. Investigue a ausência e sempre autentique, autorize e valide os dados dentro da ação.

Curingas ampliam o conjunto de origens confiáveis

allowedOrigins aceita hosts exatos e curingas: * representa um rótulo e **, um ou mais. Permita apenas domínios e subdomínios controlados pela organização e necessários. Um curinga que inclui subdomínios controlados por usuários pode confiar em uma origem fora do seu controle.

Configure o proxy reverso como parte da fronteira de segurança

O Next.js usa x-forwarded-host ou host na comparação. O proxy de borda deve descartar cabeçalhos encaminhados enviados pelo cliente e definir o valor a partir de um hostname público validado; a aplicação deve ser acessível somente por esse proxy confiável. Se o proxy encaminhar o próprio hostname interno, configure apenas a origem pública necessária em allowedOrigins. Não resolva divergências confiando em hosts arbitrários.

CONFIANÇA AMPLA
// Every subdomain, including delegated or tenant-controlled names, is trusted.
module.exports = {
  experimental: {
    serverActions: {
      allowedOrigins: ['**.example.com'],
    },
  },
};
CONFIANÇA RESTRITA
// 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: risco relacionado, separado de CSRF

A confiança no Host já causou falhas documentadas de SSRF em Server Actions. CVE-2024-34351 afetou versões auto-hospedadas anteriores à 14.1.1 quando uma ação fazia redirecionamento relativo iniciado por / e o cabeçalho Host podia ser alterado. Um aviso da Vercel de julho de 2026 descreve SSRF e possível exposição de valores internos quando servidores personalizados permitem que clientes controlem cabeçalhos associados ao host; indica correções 15.5.21 e 16.2.11. São falhas de confiança no host, não prova de desvio da comparação Origin contra CSRF.

Para o aviso de 2026, atualize para uma versão corrigida. Até lá, fixe ou valide Host e X-Forwarded-Host na borda ou no proxy. O aviso também documenta __NEXT_PRIVATE_ORIGIN como alternativa adicional a partir da versão 14.2.0. Confirme no aviso as versões afetadas e suportadas antes de aplicar a alternativa.

Autorize e valide cada Server Action

A documentação do Next.js diz para tratar os argumentos da ação como hostis e verificar se o usuário atual pode chamá-la. O exemplo vulnerável confia no ID de objeto enviado pelo cliente. O padrão corrigido autentica, valida o identificador e aplica a condição de propriedade na própria mutação do banco.

SEM AUTORIZAÇÃO DO 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 verificação: CSRF e autorização em Server Actions

Referências

Veja também Cross-Site Request Forgery (CSRF, CWE-352): como funciona e como evitar — flawopen.com SameSite=Strict substitui tokens CSRF? Token CSRF em GET: quando é necessário? JWT no localStorage vs. cookies HttpOnly: o que é mais seguro? — flawopen.com