Saltar al contenido principal
Volver al Changelog
v2.1.2 · Parche

Seguridad: rol de admin en todas las rutas de administración

Dos rutas de admin dejaban a cualquier usuario registrado leer los emails de tus suscriptores y clientes. Si tienes un proyecto en producción, aplícalo aunque no vayas a tocar nada más.

Esta versión cierra un fallo de seguridad del propio boilerplate y arregla los posts del blog con bloques de código. Si tienes un proyecto en producción construido con CREA.MBA, aplícala ya.

Rutas de admin que solo pedían sesión

GET /api/admin/newsletter y GET /api/admin/subscriptions comprobaban que hubiera una sesión, pero no que el usuario fuera admin. Cualquier usuario registrado en tu app podía leer los emails de los suscriptores de la newsletter y de tus clientes, con sus compras y suscripciones. Ahora responden 403.

Además, todo api/admin/** pasa a usar un único criterio de admin, con respuestas coherentes: 401 sin sesión y 403 con sesión sin rol de admin. Las páginas de admin de posts se protegen también en el servidor, no solo en el navegador. Y hay un test que recorre todas las rutas de admin y falla si alguna nueva no devuelve 403 a quien no es admin: un endpoint sin proteger ya no pasa bun run test.

Posts con bloques de código

Desde la 2.1.0, cualquier post del blog con un bloque de código respondía con un error 500. El resaltador de código consulta la hora mientras pinta cada línea, y Next 16 con Cache Components no lo permite. El resultado del resaltado ahora se guarda en caché y esos posts vuelven a cargar.

Si ya tienes un proyecto

  1. Copia src/lib/auth/roles.ts y src/lib/auth/admin-guard.ts a tu proyecto.
  2. En src/app/api/admin/newsletter/route.ts y src/app/api/admin/subscriptions/route.ts, envuelve el GET con withAdmin. Si no puedes copiar ficheros, el arreglo mínimo es cambiar if (!session) por if (!session || session.user.role !== 'admin') y devolver 403.
  3. Revisa tus propias rutas de admin: grep -rn "getSession" src/app/api/admin.
  4. Copia src/lib/auth/admin-guard.test.ts y pasa bun run test. Te dirá si queda alguna ruta de admin sin proteger.
  5. Para los posts con código, añade 'use cache' y cacheLife('max') al principio de markdownToHtml.
  6. rm -rf .next && bun run build en local antes de desplegar.

No hay migraciones ni variables de entorno nuevas. El detalle completo está en el CHANGELOG.md del repo.