flawopen.com/Referência/Next.js Server Actions CSRF
Next.js Server Actions contra CSRF: verificações de Origin e configuração segura
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
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.
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.
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 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.
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.
// 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: 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.
"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 verificação: CSRF e autorização em Server Actions
- ✓No proxy, rejeite hosts públicos desconhecidos e substitua
Host/X-Forwarded-Hostenviados pelo cliente por valores validados. - ✓Mantenha
allowedOriginsvazio, salvo necessidade real de proxy ou múltiplas origens; permita apenas hosts controlados com o padrão mais restrito. - ✓Em cada Server Action, autentique o usuário, valide argumentos em tempo de execução e autorize o objeto ou a operação específica.
- ✓Trate
Originausente como anomalia registrada para investigação; o aviso do framework não é uma decisão de autorização. - ✓Audite Route Handlers personalizados separadamente: eles não recebem a verificação Origin das Server Actions. Implemente e teste proteção CSRF adequada para mutações autenticadas por cookie.
- ✓Acompanhe os avisos de segurança do Next.js e atualize implantações afetadas, sobretudo servidores personalizados que aceitam cabeçalhos de host enviados por clientes.
Referências
- Next.js Docs — serverActions e allowedOrigins
- Next.js — Como pensar sobre segurança no Next.js
- Aviso Vercel — CVE-2024-34351: SSRF em Server Actions
- Aviso Vercel — GHSA-89xv-2m56-2m9x: SSRF em servidores personalizados (julho de 2026)
- CWE-352 — Cross-Site Request Forgery (CSRF)
- CWE-918 — Server-Side Request Forgery (SSRF)