Sin CSRF en Server Actions
Los Server Actions ejecutados sin validar el origen permiten que sitios maliciosos disparen acciones en nombre de usuarios autenticados.
Cómo Funciona
Los Server Actions de Next.js son requests POST bajo el hood. Si no verificas el header Origin, cualquier sitio puede hacer POST a tu URL y el servidor ejecutará la acción usando la cookie de sesión de la víctima. Es CSRF clásico aplicado al patrón nuevo de Server Actions.
// MAL: sin verificar origen — cualquier sitio puede disparar esto
export async function eliminarCuenta(formData: FormData) {
'use server';
const userId = formData.get('userId');
await db.users.delete({ where: { id: userId } });
}// BIEN: verifica el origen antes de ejecutar acciones sensibles
export async function eliminarCuenta(formData: FormData) {
'use server';
const headersList = headers();
const origin = headersList.get('origin');
if (origin !== process.env.NEXT_PUBLIC_APP_URL) {
throw new Error('Prohibido');
}
const userId = formData.get('userId');
await db.users.delete({ where: { id: userId } });
}Ejemplo Real
Cualquier acción autenticada — borrar cuenta, cambiar email, resetear contraseña — puede dispararse embebiendo un form oculto en una página maliciosa. La víctima solo necesita visitarla mientras está logueada.
Cómo Prevenirlo
- Verifica el header Origin o Referer al inicio de cada Server Action sensible
- Usa next-csrf o un token CSRF en cookie para el patrón double-submit
- Configura SameSite=Strict o SameSite=Lax en las cookies de sesión
- Pide re-autenticación (contraseña) para acciones destructivas como eliminar cuenta
Tecnologías Afectadas
Data Hogo detecta esta vulnerabilidad automáticamente.
Escanea Tu Repo GratisVulnerabilidades Relacionadas
dangerouslySetInnerHTML Sin Sanitización
highUsar dangerouslySetInnerHTML de React con input de usuario sin sanitizar permite a atacantes inyectar scripts maliciosos que se ejecutan en los navegadores de otros usuarios.
Tokens de Autenticación en localStorage
highGuardar JWT tokens, tokens de sesión o API keys en localStorage los hace accesibles a cualquier JavaScript corriendo en la página, incluyendo payloads XSS.
Exposición de Secretos en __NEXT_DATA__
highLos props de página de Next.js pasados por getServerSideProps o getStaticProps filtran datos sensibles como API keys, URLs de base de datos o configuración interna a través del script tag __NEXT_DATA__.
Source Maps Expuestos en Producción
mediumLos archivos source map de JavaScript (.map) son públicamente accesibles en producción, revelando el código fuente original completo incluyendo comentarios, nombres de variables y lógica interna.