Informe de seguridad
https://meu-app.lovable.app
14 hallazgos encontrados• informe completo
Esta nota es del alcance público — lo que un visitante alcanza sin login. No entran aquí el área logueada, lo que corre en el servidor, ni otros subdominios (api., staging., admin.). El alcance completo está más abajo.
- 24
- páginas visitadas
- 1010
- verificaciones ejecutadas
- 14
- hallazgos
Transparencia del trabajo
Lo que revisamos
Un barrido real, en un navegador de verdad: 24 páginas abiertas y 1010 verificaciones ejecutadas.
Páginas visitadas (24)
- https://meu-app.lovable.app/
- https://meu-app.lovable.app/login
- https://meu-app.lovable.app/cadastro
- https://meu-app.lovable.app/painel
- https://meu-app.lovable.app/conta
- https://meu-app.lovable.app/checkout
- https://meu-app.lovable.app/precos
- https://meu-app.lovable.app/sobre
- https://meu-app.lovable.app/contato
- https://meu-app.lovable.app/blog
- https://meu-app.lovable.app/blog/post-1
- https://meu-app.lovable.app/blog/post-2
- https://meu-app.lovable.app/termos
- https://meu-app.lovable.app/privacidade
- https://meu-app.lovable.app/faq
- https://meu-app.lovable.app/recuperar-senha
- https://meu-app.lovable.app/status
- https://meu-app.lovable.app/api/health
- https://meu-app.lovable.app/sitemap.xml
- https://meu-app.lovable.app/robots.txt
- https://api.meu-app.lovable.app/
- https://staging.meu-app.lovable.app/
- https://meu-app.lovable.app/assets/index.js
- https://meu-app.lovable.app/assets/vendor.js
Verificaciones por categoría
- Secretos expuestos2 fallas320
- Cabeceras HTTP1 falla170
- Archivos sensibles2 fallas120
- Almacenamiento en el navegador2 fallas90
- Base de datos1 falla70
- DNS / correo2 fallas60
- Bibliotecas de frontend2 fallas50
- Endpoints de API1 falla40
- Cookies1 falla40
- CORS (orígenes cruzados)Limpio20
- Transporte / TLSLimpio18
- Resiliencia (CDN/WAF)Limpio12
No adivinamos: cada hallazgo muestra cuán seguros estamos.
- Confirmado(12)lo vimos directo, con prueba (el propio dato, archivo o respuesta)
- Probable(2)señal fuerte, pero sin prueba directa
- Por confirmar(0)un indicio — conviene revisarlo antes de actuar
Clave service_role de Supabase expuesta
La clave maestra de tu base está en el código que cualquier visitante descarga. Con ella, un extraño lee, edita y borra todo — ignorando cualquier regla de acceso que pusiste.
Datos sensibles (como el token de login) están guardados en el navegador de una forma que otro script puede leer — y robar el acceso.
Secreto expuesto: Stripe
La clave secreta de Stripe quedó en el sitio. Permite emitir reembolsos, sacar tu lista de clientes y tocar tu cuenta de pagos — todo a tu nombre.
Una contraseña o clave de acceso quedó visible en el código del sitio. Quien abra la página la encuentra — y puede usar tu cuenta, gastar en tu nombre o leer tus datos.
Archivo .env expuesto
El archivo .env está abierto al público. Ahí están todas tus contraseñas y claves a la vez — el mapa del tesoro servido en bandeja.
Un archivo que debería ser privado (configuración, copia de seguridad) está abierto en internet. Es como dejar la llave debajo del tapete, a la vista de todos.
Base Firebase abierta
Tu base Firebase responde sin login. Cualquiera lee los datos de tus usuarios y, si la escritura también está abierta, los edita — sin contraseña, sin barrera.
La base de datos puede accederse directo, sin las reglas de permiso. En la práctica, cualquiera puede leer (o cambiar) los datos de todos los usuarios.
Cookie de sesión sin HttpOnly
La cookie que mantiene al usuario logueado puede leerla un script de la página. Con eso basta para que un atacante entre como si fuera él.
La cookie que parece mantener la sesión del usuario puede ser leída por JavaScript en la página. Si algún script malicioso entra al sitio (XSS), puede copiar esa cookie y usar la sesión. La marca HttpOnly cierra esa puerta.
Dato personal en el navegador
Los datos personales de tus clientes — tarjeta, identificación — quedan en el navegador, al alcance de cualquier script. Es una fuga y una multa de privacidad esperando pasar.
El sitio guarda datos personales (como tarjeta, documento o datos del usuario) en la memoria del navegador (localStorage). Cualquier script de la página puede leerlos, y quedan en la computadora — incluso en equipos compartidos.
Bucket de archivos público
Un bucket de archivos (S3/Storage) es listable. Documentos, subidas y respaldos que deberían ser privados se pueden listar y descargar uno a uno.
Un archivo que debería ser privado (configuración, copia de seguridad) está abierto en internet. Es como dejar la llave debajo del tapete, a la vista de todos.
Secreto expuesto: OpenAI
Tu clave de OpenAI se filtró en el sitio. El consumo es de quien la encuentre; la factura, a fin de mes, es tuya.
Una contraseña o clave de acceso quedó visible en el código del sitio. Quien abra la página la encuentra — y puede usar tu cuenta, gastar en tu nombre o leer tus datos.
Content-Security-Policy ausente
Sin CSP, un script inyectado corre suelto en tu página — robando datos y sesiones de tus usuarios sin aviso.
Falta la regla (CSP) que le dice al navegador desde dónde el sitio puede cargar scripts. Por sí sola no evita una falla, pero reduce mucho el daño si alguien logra inyectar código en la página.
Introspección de GraphQL abierta
El mapa completo de tu API — todos los campos y operaciones — está público. Le entrega el plano listo a quien quiera atacar, antes de intentarlo.
Un endpoint del sitio está abierto o aceptando acciones peligrosas. Puede usarse para extraer datos o abusar del sistema.
Librería con falla conocida
Tu sitio carga una librería con una falla pública ya corregida. Es una puerta vieja sin llave — los bots saben exactamente cómo entrar.
Una biblioteca que usa el sitio tiene una falla pública conocida. Es una puerta que los atacantes ya saben buscar.
DMARC ausente
Sin DMARC, cualquiera envía correo haciéndose pasar por tu dominio. Quien cae en el engaño es tu cliente, y la confianza perdida es tuya.
Tu dominio no les dice a los proveedores de correo (Gmail, Outlook…) qué hacer con mensajes que se hacen pasar por ti (DMARC). Sin eso, un correo falso en tu nombre tiene más chances de llegar a la bandeja de entrada de tus clientes.
Subdominios olvidados
Encontramos subdominios que dejaste en línea (api., staging.). Cada uno es una puerta más — y los olvidados suelen ser los más frágiles.
Esto es un inventario, no una falla: las direcciones bajo tu dominio (como api. o staging.) aparecen en registros públicos de certificados. Vale revisar si alguna es un entorno viejo o de prueba olvidado en línea — suelen quedar sin actualizar.
Scripts sin verificación de integridad
Scripts de terceros cargan sin comprobación de integridad. Si el proveedor se ve comprometido, el código malicioso entra directo a tu sitio.
El sitio carga scripts de otras empresas (como un CDN) sin una "huella digital" que confirme que el archivo no fue cambiado. Si ese proveedor fuera comprometido, el código alterado correría en tu sitio. Es una protección extra contra un riesgo raro, pero real.
Plan de acción
En este orden, y no en otro.
0→100
nota después de todo · ~6 h 45
la nota tiene techo; la porción de riesgo no
1Resolver hoy — es lo que abre la puerta
~4 h 10−93% del riesgo- Archivo .env expuesto20 min
- Secreto expuesto: Stripe30 min
- Clave service_role de Supabase expuesta35 min
- Base Firebase abierta45 min
- Cookie de sesión sin HttpOnly15 min
- Secreto expuesto: OpenAI25 min
- Bucket de archivos público40 min
- Dato personal en el navegador40 min
2Esta semana — cierra las rendijas
~1 h 45−5% del riesgo- DMARC ausente15 min
- Introspección de GraphQL abierta20 min
- Librería con falla conocida30 min
- Content-Security-Policy ausente40 min
3Cuando puedas — higiene y reputación
~50 min−1% del riesgo- Scripts sin verificación de integridad20 min
- Subdominios olvidados30 min
Estimaciones de orden de magnitud, para un dev que conoce el proyecto. La porción de riesgo y la proyección de la nota usan la misma tabla de peso del escaneo — así que el número aquí es lo que la reprueba mostrará.
Alcance de este análisis
Lo que se miró — y, con la misma claridad, lo que no.
Entró
- Las páginas públicas que el navegador alcanzó desde la dirección indicada
- Todo archivo que el sitio entrega al navegador — bundles, scripts, configuración
- Cabeceras de respuesta, cookies de sesión, política de CORS y la configuración de TLS
- Los registros DNS de correo del dominio (SPF y DMARC)
- Bibliotecas de frontend con falla pública conocida
- Archivos sensibles en rutas conocidas (.env, .git, copias de seguridad)
Quedó fuera
- Todo lo que solo existe después del login — no autenticamos en tu sitio
- El código que corre en el servidor: inyección de SQL, lógica de negocio, permisos entre usuarios
- Dependencias del servidor — desde afuera solo vemos lo que el navegador descarga
- Infraestructura fuera del sitio: puertos de base de datos, buckets, paneles en otros subdominios
- Lo que publiques después de este escaneo — la superficie cambia con cada deploy
- La prueba activa de la base de datos, que exige verificación del dominio
Ningún escaneo vuelve seguro un sistema — este cierra las puertas que están abiertas para quien llega de afuera, sin contraseña y sin conocimiento técnico, que es por donde ocurre la mayoría de los incidentes en apps nuevas. La superficie cambia con cada publicación: un escaneo es una foto, no un seguro.
Conformidad (indicativo)Qué normas tocan estos hallazgos
Los hallazgos de este informe mapean controles de los siguientes frameworks:
Mapeo indicativo para orientar la corrección — no es una evaluación ni certificación de conformidad, y no sustituye una auditoría.
Las clasificaciones OWASP y CWE son referencias técnicas públicas. El sello de LGPD/GDPR es indicativo — señala hallazgos que pueden dejar datos personales al alcance de terceros y no sustituye una evaluación jurídica.