// 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:
- PRE — Audit
NEXT_PUBLIC_env vars. Cualquier elemento con el prefijoNEXT_PUBLIC_se envía en paquetes de clientes. Si una es una clave Supabaseservice_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.tsconimport 'server-only'). - PRE — Grep for hardcoded provider keys. Fuente de búsqueda para
sk_live_,pk_live_,STRIPE_SECRET,sk-ant-,sk-,AIza,AKIAy JWT- buscando cadenas (eyJ). Mueva cada visita a.env.localy haga referencia a través deprocess.env.*únicamente en el lado del servidor. - PRE — Verify
.gitignore. Confirme.env*.local,.npmrc,.yarnrcy se ignorarán los archivos de credenciales específicos del proveedor. Ejecutegit ls-filescanalizado a través de los patrones de su proveedor para encontrar cualquier cosa que ya esté comprometida. - PRE — Scan the built bundle. Ejecute
npm run build, luego grep.next/staticy cualquier salidadist/para los mismos patrones. Si una clave llega al paquete, el desarrollador nunca tuvo una separación de entorno limpia. - 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. - DEPLOY — Disable build-log secret echo. Algunas CI configuraciones
echovariables de entorno durante la compilación. Audite sus flujos de trabajo de accionesvercel.json, GitHub o la configuración de páginas Cloudflare para detectar cualquierecho $SECRETque introduzca el valor en los registros de compilación públicos. - 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 enlocalStorageosessionStoragea través de un mal uso del SDK. - 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.
- PRE — Force RLS on every
public.*table. En Supabase: cada tabla debe tenerALTER TABLE ... ENABLE ROW LEVEL SECURITYyFORCE ROW LEVEL SECURITY. Force importa: sin él, Postgres omite RLS para los propietarios de tablas. - 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 cambiosuser_idque redireccionen la propiedad. - 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}conallow read, write: if request.auth.uid == userId; - PRE — Lint migrations in CI. Ejecute
supabase db linto un equivalente antes de fusionar. CI debería fallar en la compilación si algúnCREATE TABLE public.*carece de una política RLS coincidente. - 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.
- 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().
- PRE — Replace
getSession()withgetUser().getSession()lee la cookie y confía en ella;getUser()verifica con el backend Supabase. En las rutas del servidor utilice siempregetUser(). - 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.
- PRE — Verify JWT
audandexp. Si decodifica tokens manualmente en cualquier lugar, verifique ambas afirmaciones. Mejor: usa elgetUser()del SDK que lo hace por ti. - PRE — Audit cookie flags. Las cookies de sesión personalizadas deben ser
Secure; HttpOnly; SameSite=Lax(oStrictpara flujos que no sean OAuth). No hay material de sesión enlocalStorage. - PRE — Validate the
nextredirect param. El parámetro de consultanextdespués de iniciar sesión debe comenzar con/y no con//(redireccionamiento abierto a attacker.example). Rechace cualquier otra cosa del lado del servidor. - 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.
- 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.
- 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'enscript-src. Next.js aplica automáticamente el nonce cuando el middleware establece el encabezado de solicitudx-nonce. - PRE — Add the legacy three.
X-Content-Type-Options: nosniff,X-Frame-Options: DENY(o confiar solo en CSPframe-ancestors),Strict-Transport-Security: max-age=31536000; includeSubDomains. - PRE — Tighten
Referrer-Policy. El valor predeterminadostrict-origin-when-cross-originestá bien para la mayoría de las aplicaciones. No envíeunsafe-urlni ningún encabezado. - PRE — Replace
Access-Control-Allow-Origin: *. búscalo. Reemplace con una lista de permitidos de origen explícito. En cualquier lugar donde esté*junto acredentials: include, el navegador rechazará la solicitud, pero eso no es una defensa contra un backend mal configurado. - 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'enscript-src. - 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.
- 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 aconnect-srcen el mismo origen y sobrevive a los bloqueadores de anuncios. - 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-srcpara cargadores,connect-srcpara telemetría,frame-srcpara iframes,img-srcpara píxeles). - 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.
- PRE — Lock
package-lock.jsonin CI. Ejecutenpm ci(nonpm install) en compilaciones de producción. Audite las dependencias connpm audito Snyk antes de cada lanzamiento. - 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.
- PRE — Disable
x-powered-by. Ennext.config.js:poweredByHeader: false. Elimina una señal de divulgación de versión gratuita. - PRE — Confirm middleware lives at
src/middleware.ts. Con el diseño del directoriosrc/, Next.js ignora unmiddleware.tsde nivel raíz. El middleware mal colocado falla silenciosamente al establecer CSP/encabezados de autenticación/límites de velocidad. - 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.
- 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. - 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.
- 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.
- 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.
- POST — Confirm health-check endpoints are minimal. A
/api/healthdebería devolver200 OKsin 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.
- 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.
- 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).
- 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. - 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.
