Informe de ejemplo generado por el kit de Safe2Vibe a partir de VibeShop, una app de demostración con fallas a propósito. No se revisó ninguna app ni datos reales. Pide tu revisión gratis
Safe2VibeInforme de ejemplo

Revisión de seguridad

VibeShop (demo)

https://vibeshop-demo.example · Fecha de revisión: 2026-10-26

6 Crítico5 Alto4 Medio
23En riesgo
Puntaje /100

Resumen

Encontramos 15 tipos de problema: 6 crítico, 5 alto, 4 medio.

Arregla esto primero

  1. Crítico Tu proveedor de IA se llama directamente desde el navegador
  2. Crítico Hay una llave secreta guardada en tu código
  3. Crítico Las consultas a la base de datos se arman juntando texto

Por área

¿Es segura?Crítico 9 problemas
¿Es privada?Crítico 3 problemas
¿Es estable?Alto 1 problema
¿Está lista para crecer?Crítico 2 problemas

Hallazgos

Crítico#1

Tu proveedor de IA se llama directamente desde el navegador

La app llama a OpenAI u otro proveedor de IA desde código que corre en el navegador del visitante, así que la llave viaja con él. Cualquiera puede copiarla y gastar dinero de tu cuenta.

Dónde (2)

Pega esto en Lovable, Cursor o Bolt

Mueve todas las llamadas a la API de IA en src/lib/ai.ts:3, src/lib/ai.ts:4 a una función del servidor (por ejemplo una Edge Function de Supabase o una ruta de API). Guarda la llave en una variable de entorno del servidor, exige un usuario con sesión iniciada y haz que el navegador llame a tu función en lugar del proveedor de IA. Elimina opciones como dangerouslyAllowBrowser.

Cuando apliques el arreglo, pide a Safe2Vibe que lo vuelva a revisar.

Crítico#2

Hay una llave secreta guardada en tu código

Una llave privada o contraseña está escrita en tu código. Cualquiera que vea el código, o los archivos que tu app envía al navegador, puede usarla. Borrarla ahora no basta: queda en el historial y hay que reemplazarla.

Dónde (2)

Pega esto en Lovable, Cursor o Bolt

Saca del código el secreto encontrado en .env:3, .env:4 y cárgalo desde una variable de entorno del servidor. Asegúrate de que nunca se envíe al navegador. Luego dime exactamente dónde cambiar (rotar) esta llave con el proveedor, porque la anterior ya estuvo expuesta.

Cuando apliques el arreglo, pide a Safe2Vibe que lo vuelva a revisar.

Crítico#3

Las consultas a la base de datos se arman juntando texto

Esta consulta se arma pegando valores dentro del texto SQL. Alguien puede escribir caracteres especiales en un formulario o URL y ejecutar sus propios comandos en tu base de datos.

Dónde (1)

Pega esto en Lovable, Cursor o Bolt

En api/search.ts:6, reemplaza el SQL armado juntando texto o con template literals por una consulta parametrizada (marcadores como $1 con los valores aparte), o usa los métodos del query builder. Haz lo mismo en toda consulta que incluya datos del usuario.

Cuando apliques el arreglo, pide a Safe2Vibe que lo vuelva a revisar.

Crítico#4

La seguridad por filas está apagada en una tabla

Esta tabla de Supabase se creó sin Row Level Security. Cualquiera con la llave pública de tu app, que tiene cada visitante, puede leer y cambiar todas sus filas sin iniciar sesión.

Dónde (1)

Pega esto en Lovable, Cursor o Bolt

Activa Row Level Security en la tabla customers de Supabase. Agrega políticas para que un usuario con sesión iniciada solo pueda leer, crear, editar y borrar sus propias filas (por ejemplo donde user_id = auth.uid()). No permitas acceso anónimo salvo que la tabla deba ser pública. Muéstrame el SQL antes de aplicarlo.

Cuando apliques el arreglo, pide a Safe2Vibe que lo vuelva a revisar.

Crítico#5

La llave de administrador de Supabase está en el código

La llave service_role se salta todas las reglas de seguridad de tu base de datos. Aparece en código que puede llegar al navegador, así que cualquiera podría usarla para leer, cambiar o borrar todos tus datos.

Dónde (1)

Pega esto en Lovable, Cursor o Bolt

Elimina la llave service_role de Supabase de src/lib/supabase.ts:6 y de cualquier código del frontend. En el navegador usa solo la llave anon o publicable. Si el servidor necesita acceso de administrador, lee la llave de una variable de entorno del servidor. Luego recuérdame cambiar la llave service_role en el panel de Supabase, porque ya estuvo expuesta.

Cuando apliques el arreglo, pide a Safe2Vibe que lo vuelva a revisar.

CríticoRequiere confirmación de un experto#6

Una política de la base de datos deja que cualquiera lea o cambie datos

La seguridad por filas está activa, pero esta política permite que cualquiera, incluso sin iniciar sesión, lea o cambie todas las filas. Es como no tener protección.

Nuestras revisiones automáticas sugieren este problema. Un experto de Safe2Vibe lo confirmará contigo, porque depende de cómo funciona tu app.

Dónde (2)

Pega esto en Lovable, Cursor o Bolt

Revisa la política de Supabase "Anyone can read orders" on orders, "Public catalog" on products. Reemplaza la condición 'true' por una regla que limite el acceso al dueño de la fila (por ejemplo auth.uid() = user_id) y restríngela al rol authenticated. Muéstrame el SQL antes de aplicarlo.

Cuando apliques el arreglo, pide a Safe2Vibe que lo vuelva a revisar.

Alto#7

Una librería que usa tu app tiene una vulnerabilidad conocida

Uno de los paquetes de los que depende tu app tiene una falla de seguridad públicamente conocida. Los atacantes buscan apps que usen versiones vulnerables.

Dónde (3)

Pega esto en Lovable, Cursor o Bolt

Actualiza axios (<=0.32.0), react-router-dom (6.0.0-alpha.0 - 6.30.2), vite (<=6.4.3) a una versión sin la vulnerabilidad conocida (ejecuta npm audit para ver la versión corregida) y luego prueba la app para asegurarte de que nada se rompió.

Cuando apliques el arreglo, pide a Safe2Vibe que lo vuelva a revisar.

Alto#8

Un archivo .env con configuración está guardado en el repositorio

Archivos como .env suelen tener contraseñas y llaves de API. Cuando se guardan en el repositorio, cualquiera con acceso al código, ahora o en el futuro, puede leerlos.

Dónde (1)

Pega esto en Lovable, Cursor o Bolt

Elimina .env del repositorio, agrega .env y .env.* al .gitignore (deja un .env.example con valores vacíos) y mueve los valores reales a las variables de entorno de tu proveedor de hosting. Luego lista todas las llaves que estaban en el archivo para que pueda cambiarlas.

Cuando apliques el arreglo, pide a Safe2Vibe que lo vuelva a revisar.

AltoRequiere confirmación de un experto#9

Una página de administración podría abrir sin iniciar sesión

Esta ruta de administración no parece verificar que el visitante tenga sesión iniciada y rol de administrador. Esconderla del menú no la protege: cualquiera que escriba la dirección puede abrirla.

Nuestras revisiones automáticas sugieren este problema. Un experto de Safe2Vibe lo confirmará contigo, porque depende de cómo funciona tu app.

Dónde (2)

Pega esto en Lovable, Cursor o Bolt

Protege la ruta de administración en src/App.tsx:12, src/pages/Admin.tsx. Exige un usuario con sesión iniciada y verifica en el servidor que su rol sea admin antes de mostrar la página o devolver datos. Redirige a todos los demás al inicio de sesión.

Cuando apliques el arreglo, pide a Safe2Vibe que lo vuelva a revisar.

AltoRequiere confirmación de un experto#10

Un registro podría verse por usuarios que no son sus dueños

Este código carga un registro usando un ID de la URL o de la petición sin verificar que pertenezca al usuario con sesión iniciada. Si es así, cualquier usuario puede ver datos de otros solo cambiando el número.

Nuestras revisiones automáticas sugieren este problema. Un experto de Safe2Vibe lo confirmará contigo, porque depende de cómo funciona tu app.

Dónde (1)

Pega esto en Lovable, Cursor o Bolt

En api/orders/[id].ts:6, antes de devolver un registro cargado por su ID, verifica que pertenezca al usuario con sesión iniciada (o que tenga permiso para verlo). Si no, responde 404. Aplica la misma verificación en cada endpoint que carga, edita o borra un registro por ID.

Cuando apliques el arreglo, pide a Safe2Vibe que lo vuelva a revisar.

AltoRequiere confirmación de un experto#11

Una función de IA no tiene límite de uso

Este endpoint llama a un modelo de IA en cada petición y no limita cuántas veces puede usarlo cada usuario. Una persona, o un bot, podría enviar miles de peticiones y tú pagarías todas.

Nuestras revisiones automáticas sugieren este problema. Un experto de Safe2Vibe lo confirmará contigo, porque depende de cómo funciona tu app.

Dónde (1)

Pega esto en Lovable, Cursor o Bolt

Agrega un límite de uso al endpoint en api/chat.ts: por ejemplo máximo 30 peticiones por usuario por hora y 5 por minuto. Exige un usuario con sesión iniciada y muestra un mensaje claro al llegar al límite. Pon también un tope de gasto mensual con el proveedor de IA.

Cuando apliques el arreglo, pide a Safe2Vibe que lo vuelva a revisar.

Medio#12

Tu API acepta peticiones de cualquier sitio web

El servidor permite que cualquier sitio web lo llame desde el navegador de un visitante (Access-Control-Allow-Origin: *). Junto con otras fallas, esto deja que sitios maliciosos usen tu API en nombre de tus usuarios.

Dónde (1)

Pega esto en Lovable, Cursor o Bolt

En api/chat.ts:6, reemplaza el origen CORS comodín por los dominios exactos de tu app (por ejemplo https://miapp.com). No combines un comodín con credenciales.

Cuando apliques el arreglo, pide a Safe2Vibe que lo vuelva a revisar.

Medio#13

Se inserta HTML en la página sin limpiarlo

La app inserta HTML sin filtrar en la página. Si parte de ese contenido viene de usuarios, alguien podría inyectar un script que corra en el navegador de otros y robe sus sesiones.

Dónde (1)

Pega esto en Lovable, Cursor o Bolt

En src/components/Review.tsx:2, evita dangerouslySetInnerHTML o innerHTML con contenido que pueda venir de usuarios. Muéstralo como texto, o límpialo antes con una librería como DOMPurify.

Cuando apliques el arreglo, pide a Safe2Vibe que lo vuelva a revisar.

Medio#14

No hay encabezados de seguridad configurados

El proyecto no envía los encabezados que le dicen al navegador que bloquee ataques comunes, como que otro sitio cargue el tuyo en un marco para engañar a tus usuarios.

Dónde (1)

Pega esto en Lovable, Cursor o Bolt

Agrega encabezados de seguridad a todas las respuestas en vercel.json / netlify.toml / next.config: Strict-Transport-Security, X-Content-Type-Options: nosniff, X-Frame-Options: DENY, Referrer-Policy: strict-origin-when-cross-origin, y una Content-Security-Policy que solo permita los dominios que usa la app.

Cuando apliques el arreglo, pide a Safe2Vibe que lo vuelva a revisar.

Medio#15

Un depósito de archivos es público

Cualquiera que adivine o encuentre la dirección de un archivo puede descargarlo. Está bien para logos, pero no para facturas, documentos de identidad o archivos de usuarios.

Dónde (1)

Pega esto en Lovable, Cursor o Bolt

Revisa el depósito de Supabase invoices. Si guarda archivos de usuarios o algo privado, hazlo privado y entrega los archivos con enlaces firmados que expiren. Déjalo público solo si todo lo que contiene debe ser público.

Cuando apliques el arreglo, pide a Safe2Vibe que lo vuelva a revisar.

Qué revisamos

Esta revisión combinó revisiones automáticas (secretos, configuración de la base de datos, patrones de código, dependencias y, con autorización, el sitio en vivo) con el estándar de Safe2Vibe para apps hechas con IA.

Revisiones ejecutadas

Ninguna revisión encuentra todos los problemas, y tu app cambia con el tiempo. Lee nuestro Aviso de riesgos: https://safe2vibe.com/disclaimer

Safe2Vibe · safe2vibe.com