Lógica de Auth Solo en Frontend
Mostrar u ocultar elementos de UI basándose en el rol del usuario en React, sin ninguna validación server-side — fácilmente bypasseable abriendo DevTools.
Cómo Funciona
React renderiza en el cliente. Cualquier `if (user.role === 'admin')` en tu JSX es solo JavaScript que cualquiera puede leer y manipular. Ocultar un botón no protege el endpoint detrás de él. Los atacantes llaman la API directamente, saltándose tu UI por completo.
// MAL: panel admin oculto en UI pero API desprotegida
function Dashboard({ user }) {
return (
<div>
{user.role === 'admin' && <AdminPanel />}
</div>
);
}
// La ruta /api/admin no tiene check de auth// BIEN: enforce en el servidor, refleja en la UI
// API route:
export async function GET() {
const user = await getAuthenticatedUser();
if (user.role !== 'admin') {
return Response.json({ error: 'Prohibido' }, { status: 403 });
}
return Response.json(await getAdminData());
}Ejemplo Real
Un vibecoder construyó un SaaS donde el botón 'eliminar todos los usuarios' estaba oculto para no-admins. Un usuario curioso abrió la pestaña Network, copió el fetch() al endpoint /api/admin/users y lo ejecutó en la consola. Todos los usuarios eliminados.
Cómo Prevenirlo
- Cada API route sensible debe verificar el rol/permisos del usuario server-side, siempre
- Trata todos los checks de auth del lado del cliente solo como UX — nunca como seguridad
- Usa middleware o un helper de auth reutilizable para enforce roles en cada ruta protegida
- Prueba tus API routes directamente con curl o Postman sin sesión válida
Tecnologías Afectadas
Data Hogo detecta esta vulnerabilidad automáticamente.
Escanea Tu Repo GratisVulnerabilidades Relacionadas
API Keys Hardcodeadas
criticalAPI keys, tokens o secretos escritos directo en el código fuente, visibles para cualquiera con acceso al repo — incluyendo repos públicos de GitHub.
Sin Validación de Inputs
mediumDatos enviados por el usuario pasados directo a bases de datos o APIs externas sin ninguna validación de tipo, formato o contenido.
Contraseñas en Texto Plano
criticalContraseñas de usuarios guardadas como strings crudos en la base de datos en lugar de hashearse con bcrypt o Argon2.
JWT Sin Expiración
highJWTs firmados sin el claim `exp` que nunca expiran, lo que significa que un token robado da acceso permanente sin forma de revocarlo.