FixVibe

// docs / security guides / pre-ship checklist

La checklist de seguridad de vibe coding: 44 ítems antes de enviar

Una checklist práctica y organizada por fase para apps creadas con Cursor, Claude Code, Lovable, Bolt, v0, Replit y Windsurf. Cada ítem es accionable en menos de cinco minutos. Recórrela antes de enviar a producción y otra vez antes de cada release importante. Los ítems se agrupan en siete categorías — secretos, base de datos, autenticación, cabeceras, terceros, despliegue, monitoreo — y se etiquetan con la fase de deploy a la que aplican.

PRE = implementación previa (audite su fuente). DEPLOY = en el momento de la implementación. POST = verificación posterior a la implementación. Referencia de artículos FixVibe verifique los ID en formato category.check-id cuando sea relevante.

Secretos y claves API (8 artículos)

Las claves codificadas son el hallazgo más común en aplicaciones codificadas por vibración. Ocho elementos para mantenerlos alejados:

  1. PRE — Audit NEXT_PUBLIC_ env vars. Cualquier elemento con el prefijo NEXT_PUBLIC_ se envía en paquetes de clientes. Si una es una clave Supabase service_role (se decodifica a JWT con "role":"service_role"), elimínela y enrútela a través de un cliente de solo servidor (src/lib/supabase/service.ts con import 'server-only').
  2. PRE — Grep for hardcoded provider keys. Fuente de búsqueda para sk_live_, pk_live_, STRIPE_SECRET, sk-ant-, sk-, AIza, AKIA y JWT- buscando cadenas (eyJ). Mueva cada visita a .env.local y haga referencia a través de process.env.* únicamente en el lado del servidor.
  3. PRE — Verify .gitignore. Confirme .env*.local, .npmrc, .yarnrc y se ignorarán los archivos de credenciales específicos del proveedor. Ejecute git ls-files canalizado a través de los patrones de su proveedor para encontrar cualquier cosa que ya esté comprometida.
  4. PRE — Scan the built bundle. Ejecute npm run build, luego grep .next/static y cualquier salida dist/ para los mismos patrones. Si una clave llega al paquete, el desarrollador nunca tuvo una separación de entorno limpia.
  5. DEPLOY — Set secrets per environment. Vercel: Configuración → Variables de entorno, alcance cada una a Producción/Vista previa/Desarrollo. Nunca comparta sk_live_* con el entorno de vista previa. Utilice el almacenamiento env-var cifrado de Vercel, no los secretos de flujo de trabajo en línea.
  6. DEPLOY — Disable build-log secret echo. Algunas CI configuraciones echo variables de entorno durante la compilación. Audite sus flujos de trabajo de acciones vercel.json, GitHub o la configuración de páginas Cloudflare para detectar cualquier echo $SECRET que introduzca el valor en los registros de compilación públicos.
  7. El nivel Free de POST — Run a passive scan. FixVibe cubre esto: pegue el URL implementado, espere ~20 segundos, busque los resultados de secrets.*. El cheque secrets.browser-storage captura claves que aterrizaron en localStorage o sessionStorage a través de un mal uso del SDK.
  8. POST — Rotate any key that ever shipped. Si una clave estuvo en un paquete público incluso durante minutos, trátela como comprometida. Gire las claves de función de servicio Supabase a través del panel, regenere las claves restringidas Stripe, revoque las claves Anthropic / OpenAI / Google a través de sus consolas.

Control de acceso a la base de datos: RLS y reglas de Firestore (6 elementos)

Los valores predeterminados de BaaS son permisivos a propósito, por lo que el primer tutorial funciona. Producción necesita políticas explícitas.

  1. PRE — Force RLS on every public.* table. En Supabase: cada tabla debe tener ALTER TABLE ... ENABLE ROW LEVEL SECURITY y FORCE ROW LEVEL SECURITY. Force importa: sin él, Postgres omite RLS para los propietarios de tablas.
  2. PRE — Write a policy per (table, role, action). Mínimo: una política SELECT que se une el auth.uid(). Mejor: separe las políticas INSERT / UPDATE / DELETE para que un UPDATE no pueda contrabandear cambios user_id que redireccionen la propiedad.
  3. PRE — Replace default Firebase rules. Las reglas predeterminadas del modo de prueba dicen allow read, write: if true;. Reemplace con reglas vinculadas a autenticación por colección: match /users/{userId} con allow read, write: if request.auth.uid == userId;
  4. PRE — Lint migrations in CI. Ejecute supabase db lint o un equivalente antes de fusionar. CI debería fallar en la compilación si algún CREATE TABLE public.* carece de una política RLS coincidente.
  5. DEPLOY — Confirm RLS survived deploy. Vuelva a verificar en Supabase Studio después de la implementación: Tablas → cada fila → RLS alternar es ON. Producción Las migraciones de bases de datos ocasionalmente se adelantan a los archivos de políticas; Verifique que la política esté activa.
  6. POST — Run an active scan against a verified domain. La verificación activa baas.supabase-rls escribe en una pequeña fila de semillas usando la tecla anónima e informa si la escritura se realizó correctamente: i.e. RLS en realidad no está haciendo cumplir.

Autenticación y sesiones (7 artículos)

Los errores de autenticación en aplicaciones codificadas con AI- tienden a ser sutiles: un error uno por uno en la verificación del token, un indicador HttpOnly perdido, un getSession() donde debería haber un getUser().

  1. PRE — Replace getSession() with getUser(). getSession() lee la cookie y confía en ella; getUser() verifica con el backend Supabase. En las rutas del servidor utilice siempre getUser().
  2. PRE — Confirm token expiry. Los tokens de enlace mágico, restablecimiento de contraseña y verificación de correo electrónico necesitan una caducidad impuesta por el servidor. Los enlaces mágicos Supabase predeterminados caducan después de 1 hora; no lo anule a un número mayor sin una razón real.
  3. PRE — Verify JWT aud and exp. Si decodifica tokens manualmente en cualquier lugar, verifique ambas afirmaciones. Mejor: usa el getUser() del SDK que lo hace por ti.
  4. PRE — Audit cookie flags. Las cookies de sesión personalizadas deben ser Secure; HttpOnly; SameSite=Lax (o Strict para flujos que no sean OAuth). No hay material de sesión en localStorage.
  5. PRE — Validate the next redirect param. El parámetro de consulta next después de iniciar sesión debe comenzar con / y no con // (redireccionamiento abierto a attacker.example). Rechace cualquier otra cosa del lado del servidor.
  6. POST — Test logout. Iniciar sesión, cerrar sesión, inspeccionar las cookies (DevTools → Aplicación → Cookies). La cookie de sesión debe borrarse en la misma respuesta. Si persiste, el controlador de cierre de sesión en realidad no está destruyendo el estado del lado del servidor.
  7. POST — Active probe. Las comprobaciones active.auth-flow y active.account-enumeration muestran límites de autenticación rotos: diferentes respuestas sobre "el usuario existe" frente a "contraseña incorrecta", falta el límite de velocidad al iniciar sesión, tokens de reinicio sin firmar.

HTTP encabezados de seguridad y política de seguridad de contenido (6 elementos)

Los encabezados son el refuerzo más barato de todo el proceso y el que Codegen omite con mayor frecuencia.

  1. PRE — Ship a real CSP. Mínimo: script-src 'nonce-{NONCE}' 'strict-dynamic'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'. No 'unsafe-inline' en script-src. Next.js aplica automáticamente el nonce cuando el middleware establece el encabezado de solicitud x-nonce.
  2. PRE — Add the legacy three. X-Content-Type-Options: nosniff, X-Frame-Options: DENY (o confiar solo en CSP frame-ancestors), Strict-Transport-Security: max-age=31536000; includeSubDomains.
  3. PRE — Tighten Referrer-Policy. El valor predeterminado strict-origin-when-cross-origin está bien para la mayoría de las aplicaciones. No envíe unsafe-url ni ningún encabezado.
  4. PRE — Replace Access-Control-Allow-Origin: *. búscalo. Reemplace con una lista de permitidos de origen explícito. En cualquier lugar donde esté * junto a credentials: include, el navegador rechazará la solicitud, pero eso no es una defensa contra un backend mal configurado.
  5. DEPLOY — Verify headers post-deploy. Abra DevTools → Red → haga clic en su documento raíz → pestaña Encabezados. CSP, HSTS, X-Frame-Options, X-Content-Type-Options deben estar presentes. CSP no debe tener 'unsafe-inline' en script-src.
  6. POST — Run headers.security-headers. La verificación pasiva del encabezado informa cada encabezado faltante con una guía de corrección de la plataforma de implementación (Vercel vercel.json, Cloudflare Pages _headers, Netlify _headers, Next.js middleware).

Integraciones de terceros y APIs (5 artículos)

Cada script que incluya es una exención CSP y una posible superficie de la cadena de suministro. Trate a terceros como parte de su límite de confianza.

  1. PRE — Reverse-proxy analytics where possible. PostHog, Plausible y Umami admiten el proxy a través de su propio dominio (e.g. /api/posthog). Esto mantiene a connect-src en el mismo origen y sobrevive a los bloqueadores de anuncios.
  2. PRE — CSP-allowlist the rest. Para Google Analytics, Stripe.js, Sentry, Intercom, GTM, etc., agregue los orígenes de cada proveedor a la directiva CSP correspondiente (script-src para cargadores, connect-src para telemetría, frame-src para iframes, img-src para píxeles).
  3. PRE — Use Stripe Checkout, not raw card forms. Stripe El pago es una redirección de nivel superior; no se necesita ninguna entrada CSP para el script. La superficie alojada PCI vive completamente en el dominio de Stripe. Haz el tuyo solo si tienes una buena razón.
  4. PRE — Lock package-lock.json in CI. Ejecute npm ci (no npm install) en compilaciones de producción. Audite las dependencias con npm audit o Snyk antes de cada lanzamiento.
  5. POST — Watch discovery.tech-fingerprint. El descubrimiento pasivo de la pila tecnológica muestra las versiones de la biblioteca visibles para un rastreador. Si envía un EOL React, jQuery o Bootstrap, FixVibe lo marca y lo vincula a CVE conocidos.

Higiene e infraestructura del despliegue (8 artículos)

La forma de implementar importa tanto como lo que se implementa. Las aplicaciones AI-codificadas se benefician especialmente del refuerzo de implementación explícito.

  1. PRE — Disable x-powered-by. En next.config.js: poweredByHeader: false. Elimina una señal de divulgación de versión gratuita.
  2. PRE — Confirm middleware lives at src/middleware.ts. Con el diseño del directorio src/, Next.js ignora un middleware.ts de nivel raíz. El middleware mal colocado falla silenciosamente al establecer CSP/encabezados de autenticación/límites de velocidad.
  3. PRE — Sanity-check Vercel deployment protection. Prola producción debe ser pública; La vista previa debe estar protegida con contraseña o limitada a los miembros de la organización. discovery.platform-vercel informa la superficie.
  4. PRE — Block dotfile and config probes at the edge. Agregue una regla de reescritura o denegación para los patrones /.env, /.git/*, /.aws/*, /.next/trace. Vercel devuelve 403 para muchos de estos de forma predeterminada; verificar por distintos modos.
  5. DEPLOY — Separate environments. Producción, Vista previa, Desarrollo. Cada uno tiene su propio conjunto de secretos. Las claves en vivo nunca llegan a la Vista previa, el modo de prueba Stripe nunca llega a la Producción.
  6. DEPLOY — Enable Vercel Web Application Firewall. Pro y los planes Enterprise incluyen WAF con reglas administradas. Cloudflare Pages tiene el modo de lucha contra robots. Ambos reducen el abuso de los escáneres automáticos y la carga de pulverización de contraseñas.
  7. POST — Verify TLS configuration. SSL Labs o testssl.sh contra su dominio de producción. TLS 1.2 mínimo, prefiera TLS 1.3, sin cifrados débiles, HSTS elegible para precarga.
  8. POST — Confirm health-check endpoints are minimal. A /api/health debería devolver 200 OK sin cuerpo. No haga eco del entorno, no cree hash ni implemente marcas de tiempo sin autenticación.

Monitoreo continuo y reescaneo (4 ítems)

La seguridad no es una auditoría única previa al envío. La deriva ocurre en cada despliegue.

  1. Verify your production domain in FixVibe. Dashboard → Domains → DNS TXT o HTTP verificación de archivos. Esto desbloquea reanálisis programados, sondeos activos y monitoreo de amenazas en vivo.
  2. Los planes Schedule passive re-scans. Pro admiten una cadencia de 3 horas; Unlimited admite una cadencia de 6 horas. Cada análisis programado que muestra un nuevo hallazgo activa un correo electrónico (y un webhook si ha conectado uno).
  3. Wire outbound webhooks. Account → Webhooks → agregue un punto final HTTPS, suscríbase a scan.completed + finding.created + scan.active_api.first_used. Ruta a Slack / Discord / PagerDuty.
  4. Enable live threat monitoring on Unlimited. Diferencias de registros de transparencia de certificados, cambios DNS, filtraciones de secretos de paquetes JS, listados de información sobre amenazas: se activan en el momento en que se detectan, no en el siguiente análisis programado.

Próximos pasos

¿Quiere conocer el trasfondo educativo sobre por qué son importantes estos elementos? Leer AI-generated code security scanning. ¿Quiere fragmentos de código concretos para cada paso de endurecimiento? Ver How to secure an app built with AI coding tools.

// escanea tu app

Deja de leer. Empieza a encontrar las brechas en la tuya.

Pega una URL — FixVibe ejecuta todas las verificaciones pasivas de esta guía más 200 adicionales en menos de un minuto. Gratis, sin instalación, sin tarjeta.

  • Tier gratis — 3 escaneos / mes, sin tarjeta.
  • Escaneos pasivos contra cualquier URL — sin verificación de dominio.
  • Afinado para Cursor, Claude Code, Lovable, Bolt, v0, Replit.
  • Coding-agent prompts for code/config findings, plus operator steps for DNS/provider fixes.
La checklist de seguridad de vibe coding: 44 ítems antes de enviar — Docs · FixVibe