[{"data":1,"prerenderedAt":870},["ShallowReactive",2],{"blog-es-vibe-coded-app-security-checklist":3,"blog-index-es":636},{"id":4,"title":5,"body":6,"category":588,"cover":589,"coverAlt":590,"description":591,"draft":592,"extension":593,"faq":594,"image":613,"keywords":614,"meta":624,"navigation":625,"ogTitle":626,"path":627,"published":628,"seo":629,"stem":630,"tldr":631,"updated":628,"__hash__":635},"blog_es\u002Fblog\u002Fvibe-coded-app-security-checklist.md","La lista de seguridad del vibe coding, en nueve comprobaciones",{"type":7,"value":8,"toc":565},"minimark",[9,13,21,24,27,32,35,41,185,194,198,201,209,214,226,242,260,264,272,275,288,292,301,312,320,324,327,335,343,347,350,353,357,360,363,371,375,378,381,389,393,396,399,407,411,414,417,421,424,427,432,436,439,442,450,466,469,473,476,479,485,489,492,495,505,512,516,552],[10,11,12],"p",{},"Estás a punto de mandarle a alguien la dirección de tu app, y una vocecita te\ndice que antes deberías revisarla. Así que buscas una lista de seguridad del\nvibe coding y encuentras una de veinticinco puntos, escrita por alguien que da\npor hecho que ya sabes qué es una Content Security Policy.",[10,14,15,16,20],{},"Esta es la parte que lista tras lista se equivoca: ",[17,18,19],"strong",{},"casi nada de lo que hay en\nellas se puede comprobar."," \"Usa contraseñas fuertes\" es un consejo. \"Limpia el\ncódigo muerto\" es orden doméstico. \"Sigue el principio de mínimo privilegio\" es\nuna frase. Ninguno tiene una prueba, así que ninguno se puede terminar, y una\nlista que no puedes terminar es una preocupación con números.",[10,22,23],{},"Esta tiene nueve puntos. Nueve es la cantidad de cosas que cualquiera puede\nverificar en una app en marcha desde fuera, sin tu contraseña, sin tu\nrepositorio y sin tu cuenta de Supabase. Cada uno tiene una prueba que puedes\nhacer tú y cada prueba vuelve con un sí o un no.",[10,25,26],{},"Piénsalo como la vuelta que da un piloto alrededor de un avión antes de volar.\nEs corta, todo lo que hay en ella se ve desde la pista, y no sustituye nada del\nlibro de mantenimiento. La última sección de este artículo trata del libro.",[28,29,31],"h2",{"id":30},"qué-debe-llevar-una-lista-de-seguridad-del-vibe-coding","¿Qué debe llevar una lista de seguridad del vibe coding?",[10,33,34],{},"Nueve preguntas, y son las nueve que un desconocido podría hacerle a tu app esta\ntarde, las hayas revisado o no.",[36,37],"diagram",{"alt":38,"caption":39,"src":40},"La marca de Reeve sobre una fila de nueve iconos con contorno: una llave, un cilindro de base de datos, un documento, un candado, una caja con tapa, un par de corchetes de código, un globo terráqueo, una roseta de certificado y un calendario.","Las nueve, en el orden en que las recorren las secciones de abajo. Todas se leen desde fuera, y eso es lo que hace que cada una sea comprobable.","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fnine-checks-1600x420.png",[42,43,44,60],"table",{},[45,46,47],"thead",{},[48,49,50,54,57],"tr",{},[51,52,53],"th",{},"La comprobación",[51,55,56],{},"La prueba que puedes hacer tú",[51,58,59],{},"Qué significa si vuelve mal",[61,62,63,89,100,119,130,141,152,163,174],"tbody",{},[48,64,65,69,86],{},[66,67,68],"td",{},"Claves secretas en tu código",[66,70,71,72,76,77,76,80,76,83],{},"Busca en el proyecto ",[73,74,75],"code",{},"sk_",", ",[73,78,79],{},"sb_secret_",[73,81,82],{},"service_role",[73,84,85],{},"AKIA",[66,87,88],{},"Quien la encuentre puede gastar tu dinero o leer cada fila",[48,90,91,94,97],{},[66,92,93],{},"Reglas de la base de datos",[66,95,96],{},"Supabase, luego el Security Advisor",[66,98,99],{},"Cualquiera con tu clave pública puede leer esas filas",[48,101,102,105,116],{},[66,103,104],{},"Archivos privados",[66,106,107,108,111,112,115],{},"Abre ",[73,109,110],{},"\u002F.env"," y ",[73,113,114],{},"\u002F.git\u002Fconfig"," en una ventana privada",[66,117,118],{},"Cada clave que creías en el servidor se puede descargar",[48,120,121,124,127],{},[66,122,123],{},"Buckets de almacenamiento",[66,125,126],{},"Supabase, luego Storage, luego la columna Public y las políticas",[66,128,129],{},"Un desconocido obtiene la lista de lo que subieron tus usuarios",[48,131,132,135,138],{},[66,133,134],{},"Cabeceras de seguridad",[66,136,137],{},"Un escaneo; esta no tiene versión desde la barra de direcciones",[66,139,140],{},"Tus visitantes son más fáciles de atacar a través de tu página",[48,142,143,146,149],{},[66,144,145],{},"Source maps publicados",[66,147,148],{},"Herramientas de desarrollo, Sources, busca tus propios nombres",[66,150,151],{},"Tu código original se puede leer, con comentarios y todo",[48,153,154,157,160],{},[66,155,156],{},"Tus propias direcciones de API",[66,158,159],{},"Abre una en una ventana privada sin sesión iniciada",[66,161,162],{},"Lo que devuelva es público",[48,164,165,168,171],{},[66,166,167],{},"Caducidad del certificado",[66,169,170],{},"Pulsa el candado, abre el certificado, lee \"Válido hasta\"",[66,172,173],{},"Los visitantes se topan con un aviso del navegador a página completa",[48,175,176,179,182],{},[66,177,178],{},"Renovación del dominio",[66,180,181],{},"La fecha de caducidad en tu registrador, y si la autorrenovación está activa",[66,183,184],{},"La app desaparece y el nombre sale a la venta",[10,186,187,188,193],{},"Nuestro propio ",[189,190,192],"a",{"href":191},"\u002Fsecurity-scanner","escáner de seguridad gratuito"," hace las nueve\nsobre cualquier URL en marcha en unos 20 segundos y sin cuenta, que es la vía\nmás rápida para la primera pasada. Lee, nunca inicia sesión y nunca escribe\nnada. Cada punto de abajo sigue siendo algo que puedes comprobar a mano, y las\npruebas están escritas para que puedas contrastar una línea de nuestro informe\ncon tu propio panel.",[28,195,197],{"id":196},"los-cuatro-antes-de-compartir-la-dirección","Los cuatro antes de compartir la dirección",[10,199,200],{},"Claves secretas, reglas de la base de datos, archivos privados y buckets de\nalmacenamiento. En estos cuatro lo que queda expuesto son tus datos o tu dinero,\ny los cuatro son tuyos para arreglar y no de tu plataforma de alojamiento.",[10,202,203,204,208],{},"Tres de ellos son las únicas comprobaciones de todo el conjunto que pueden\ninformar de un hallazgo crítico, y la cuarta es aquella en la que lo expuesto es\nlo que subieron tus usuarios. Entre el 12 y el 14 de agosto de 2026 pasamos las\nnueve comprobaciones sobre\n",[189,205,207],{"href":206},"\u002Fresearch\u002Fvibe-coded-app-security-2026","30.998 apps de vibe coding en marcha",",\ny las cifras de cada sección de abajo salen de esa tanda.",[210,211,213],"h3",{"id":212},"_1-hay-una-clave-secreta-en-el-código-que-envía-tu-app","1. ¿Hay una clave secreta en el código que envía tu app?",[10,215,216,217,76,219,76,221,111,223,225],{},"Busca en todo tu proyecto ",[73,218,75],{},[73,220,79],{},[73,222,82],{},[73,224,85],{},". Una\ncoincidencia dentro de cualquier cosa que el navegador descargue es el hallazgo.",[10,227,228,229,232,233,236,237,241],{},"Todo lo que tu app necesita para funcionar en un navegador llega a ese\nnavegador, así que una clave que esté ahí llega también. Algunas claves van ahí:\nuna clave de Supabase ",[73,230,231],{},"anon"," o ",[73,234,235],{},"sb_publishable_"," es una dirección y no un\npermiso, y encontrarla es correcto.\n",[189,238,240],{"href":239},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","Qué claves son seguras en un frontend y cuáles no","\nes esa distinción entera.",[10,243,244,245,247,248,250,251,254,255,259],{},"Una clave secreta es la otra clase. Una clave de Supabase ",[73,246,79],{}," o\n",[73,249,82],{}," ignora cualquier regla de tabla que hayas escrito jamás. Una\nclave de Stripe ",[73,252,253],{},"sk_live_"," mueve dinero. Encontramos una clave de esa clase en\n52 apps de 30.998, que es poco frecuente y lo peor de esta lista cuando ocurre.\nSi la tuya es una de ellas,\n",[189,256,258],{"href":257},"\u002Fblog\u002Frotate-supabase-service-role-key","rótala antes de hacer nada más",":\nborrar la clave de tu código deja el valor antiguo funcionando.",[210,261,263],{"id":262},"_2-puede-un-desconocido-leer-tu-base-de-datos","2. ¿Puede un desconocido leer tu base de datos?",[10,265,266,267,271],{},"En Supabase, abre el Security Advisor. Cada entrada que diga que una tabla es\npública pero la seguridad por filas no está activada es una tabla que le\nresponde a cualquiera que pregunte, y\n",[189,268,270],{"href":269},"\u002Fblog\u002Fsupabase-rls-disabled-in-public","ese aviso exacto"," tiene artículo propio.",[10,273,274],{},"Row Level Security es la regla que decide, fila por fila, quién puede ver qué.\nSin ella, la clave pública que hay en tu app basta para leer la tabla, y esa\nclave está en el navegador de cada visitante por diseño.",[10,276,277,278,282,283,287],{},"Es el hallazgo serio más común de todo el conjunto: 2.096 de las 3.680 apps cuyo\nproyecto de Supabase nos respondió, o el 57 %, tenían al menos una tabla\nentregando filas a una petición sin nadie con sesión iniciada.\n",[189,279,281],{"href":280},"\u002Fblog\u002Fenable-rls-on-every-supabase-table","Activarla en todas las tablas"," es el\narreglo. El advisor lee tus ajustes y no las respuestas de tu base de datos, así\nque termina comprobando desde fuera: una tabla puede tener el ajuste activado y\nuna política que ",[189,284,286],{"href":285},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","deja pasar a todo el mundo igualmente",".",[210,289,291],{"id":290},"_3-puede-cualquiera-descargar-tus-archivos-privados","3. ¿Puede cualquiera descargar tus archivos privados?",[10,293,107,294,111,297,300],{},[73,295,296],{},"tuapp.com\u002F.env",[73,298,299],{},"tuapp.com\u002F.git\u002Fconfig"," en una ventana privada. Ninguno\nde los dos debería abrirse.",[10,302,303,304,307,308,311],{},"Un archivo ",[73,305,306],{},".env"," es cada clave que creías a salvo en el servidor, en una lista\nsimple, en una dirección adivinable. Un directorio ",[73,309,310],{},".git"," es la historia de tu\nproyecto. Ninguno está pensado para servirse, y de vez en cuando se sirven,\nnormalmente porque una compilación copió una carpeta que no debía.",[10,313,314,315,319],{},"Es lo más raro que encontramos: 8 apps de 30.749. También son cinco segundos de\ntrabajo descartarlo, y es\n",[189,316,318],{"href":317},"\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","de donde salen las filtraciones más dañinas","\ncuando ocurre.",[210,321,323],{"id":322},"_4-tus-buckets-de-almacenamiento-listan-lo-que-contienen","4. ¿Tus buckets de almacenamiento listan lo que contienen?",[10,325,326],{},"En Supabase, abre Storage. Lee la columna Public en cada bucket y luego abre las\npolíticas de cualquier bucket que guarde algo que no sea para todo el mundo.",[10,328,329,330,334],{},"Aquí pasan dos cosas distintas y es fácil juntarlas. Un bucket público sirve\ncualquier archivo cuyo nombre ya conozca alguien. Un bucket ",[331,332,333],"em",{},"listable"," entrega\nlos nombres, lo que convierte \"alguien tendría que adivinar\" en un directorio de\nlas subidas de tus usuarios. Nuestra comprobación prueba lo segundo, porque es\nlo que cambia lo que un desconocido puede hacer de verdad.",[10,336,337,338,342],{},"792 apps de 27.269 tenían un bucket que se listó ante nosotros sin sesión\niniciada. ",[189,339,341],{"href":340},"\u002Fblog\u002Fsupabase-storage-bucket-public","Qué obtiene un desconocido de esa lista","\nes la versión larga, y el arreglo suele ser un interruptor más una política.",[28,344,346],{"id":345},"los-cinco-que-pueden-esperar-a-que-tengas-usuarios","Los cinco que pueden esperar a que tengas usuarios",[10,348,349],{},"Cabeceras, source maps, tus propias direcciones de API, el certificado y el\ndominio. Tres de ellos los fija normalmente quien aloja tu app, y dos son fechas\nen un calendario.",[10,351,352],{},"Ninguno entrega por sí solo una fila de tu base de datos, y por eso están en el\nsegundo grupo. Uno de los cinco merece adelantarse si tu app tiene backend\npropio, y está señalado abajo.",[210,354,356],{"id":355},"_5-están-activadas-las-cabeceras-de-seguridad-del-navegador","5. ¿Están activadas las cabeceras de seguridad del navegador?",[10,358,359],{},"Es el único punto de la lista sin una versión que puedas hacer desde la barra de\ndirecciones. Un escaneo las lee, o abres las herramientas de desarrollo de tu\nnavegador, vas a la pestaña Red, pulsas la primera petición y lees las cabeceras\nde respuesta.",[10,361,362],{},"Son instrucciones pequeñas para el navegador: carga esta página solo por HTTPS,\nniégate a que otro sitio te meta en un marco, no adivines tipos de archivo. Su\nausencia no expone nada por sí misma. Quita protecciones que hacen más difíciles\notros ataques.",[10,364,365,366,370],{},"Casi nadie pasa este punto y casi nadie puede. A 30.756 apps de 30.981 les\nfaltaba al menos una, y en un subdominio de builder el ajuste es de la\nplataforma. ",[189,367,369],{"href":368},"\u002Fblog\u002Fmissing-security-headers","Si puedes hacer algo con las tuyas","\ndepende enteramente de dónde esté alojada tu app.",[210,372,374],{"id":373},"_6-está-publicado-tu-código-fuente-original","6. ¿Está publicado tu código fuente original?",[10,376,377],{},"Abre tu app en marcha, abre las herramientas de desarrollo de tu navegador y\nmira el panel Sources. Si tus propios archivos aparecen ahí con el código que\nescribiste y los comentarios que dejaste, los source maps salieron con la\ncompilación.",[10,379,380],{},"Un source map es una tabla de traducción que convierte el archivo comprimido que\nenvía tu app de vuelta en código legible. Los desarrolladores lo usan para\ndepurar un sitio en marcha. Publicado en internet, significa que cualquiera\npuede leer tu app tal como la escribiste.",[10,382,383,384,388],{},"3.885 apps de 30.987 publicaron los suyos. No es una filtración por sí misma, y\nse convierte en una cuando el código contiene algo que dabas por hecho que nadie\nleería. ",[189,385,387],{"href":386},"\u002Fblog\u002Fsource-maps-exposed-in-production","Qué expone un source map publicado","\ncubre la diferencia y el ajuste de compilación que lo apaga.",[210,390,392],{"id":391},"_7-tus-propias-direcciones-de-api-le-responden-a-un-desconocido","7. ¿Tus propias direcciones de API le responden a un desconocido?",[10,394,395],{},"Copia una de las direcciones de API de tu app desde la pestaña Red y luego ábrela\nen una ventana privada donde no tengas la sesión iniciada. Mira qué vuelve.",[10,397,398],{},"Este es el punto que conviene adelantar si tu app tiene backend propio, porque\ncualquier cosa que una dirección entregue a una petición sin sesión es pública,\ntenga la pinta que tenga la página que hay delante. 3.852 apps de 30.926 tenían\nal menos una.",[10,400,401,402,406],{},"El ajuste emparentado es CORS, que decide qué otros sitios web pueden llamar a\ntu app desde el navegador de un visitante. Un comodín ahí muchas veces está bien\ny de vez en cuando no, y\n",[189,403,405],{"href":404},"\u002Fblog\u002Fcors-wildcard-security-risk","cuál de los dos tienes"," merece leerse antes\nde cambiar nada.",[210,408,410],{"id":409},"_8-está-tu-certificado-a-punto-de-caducar","8. ¿Está tu certificado a punto de caducar?",[10,412,413],{},"Pulsa el candado de la barra de direcciones, abre el certificado y lee la fecha\nde \"Válido hasta\".",[10,415,416],{},"Casi todos los alojamientos los renuevan solos y casi todos lo consiguen. 32\napps de 30.851 tenían un certificado caducado, a punto de caducar o no fiable.\nCuando falla, los visitantes reciben un aviso del navegador a página completa\ndiciéndoles que tu sitio no es seguro, y la mayoría se va.",[210,418,420],{"id":419},"_9-está-renovado-tu-dominio","9. ¿Está renovado tu dominio?",[10,422,423],{},"Entra en tu registrador, lee la fecha de caducidad y comprueba que la\nautorrenovación está activa y que la tarjeta que hay detrás no ha caducado.",[10,425,426],{},"Es el punto menos técnico de la lista y el único que puede sacar tu app de\ninternet por completo. 55 apps de 30.980 tenían un dominio caducado o a punto de\ncaducar. Un nombre vencido también lo puede registrar otra persona, junto con\ncada enlace que alguien haya hecho hacia él.",[36,428],{"alt":429,"caption":430,"src":431},"Los mismos nueve iconos de comprobación en dos columnas. A la izquierda están ordenados por la frecuencia con que un escaneo encuentra cada uno; a la derecha por el orden en que los recorre este artículo. Unas líneas curvas conectan cada icono consigo mismo y se cruzan en el centro, cuatro de ellas en color de acento.","Izquierda: con qué frecuencia encontramos cada uno en 30.998 apps. Derecha: el orden de esta lista. Los dos no coinciden, y por eso el hallazgo más común de internet no es lo primero que hay que hacer.","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Ftwo-orders-of-nine-1600x790.png",[28,433,435],{"id":434},"qué-llevan-otras-listas-que-no-es-una-comprobación-de-seguridad","Qué llevan otras listas que no es una comprobación de seguridad",[10,437,438],{},"Copias de seguridad, monitorización de errores, código muerto y consejos sobre\ncontraseñas. La primera es la que más probablemente te cueste algo, y no es una\ncomprobación de seguridad, porque nada fuera de tu app puede decir si tienes\nuna.",[10,440,441],{},"Esa es la razón honesta de que falte entre las nueve. Un escáner lee tu sitio en\nmarcha; una copia de seguridad es una copia de tu base de datos guardada en otro\nsitio, y ninguna mirada desde fuera a tu app puede decir si existe, si está al\ndía o si se restauraría. Aun así va en tu lista. Va en el tipo de lista que se\nlleva, no en el tipo que se recorre.",[10,443,444,445,449],{},"Las copias propias de Supabase dependen de tu plan y se quedan dentro de tu\ncuenta de Supabase, lo cual está bien hasta que el problema es la cuenta.\n",[189,446,448],{"href":447},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","Las tres vías para tener una copia tuya","\nexpone qué cubre cada una.",[10,451,452,453,457,458,461,462,287],{},"Si prefieres que ocurra sin ti, eso es ",[189,454,456],{"href":455},"\u002Fpricing","Reeve Care",". Hace una copia de\ntu base de datos de Supabase con la frecuencia que fija el plan que tengas, cada\nnoche en el nivel de entrada y hasta cuatro veces al día en el más alto, lee\ncada copia de vuelta antes de que cuente como copia de seguridad, y la guarda\ndonde Supabase no llega. Cuánto puedes retroceder lo fija el mismo plan.\nRestaurar es un botón, y toma una instantánea del estado actual antes de\nempezar, así que pulsarlo en pleno pánico no puede destruir lo que intentabas\nsalvar. Los archivos subidos también entran, en cuanto conectas una credencial\nde Storage, que se pide por separado porque es la única clave que tenemos capaz\nde escribir: Supabase no emite una clave de solo lectura para archivos. Care\nempieza en $49 al mes por una app, y es un precio de lista, así que la\n",[189,459,460],{"href":455},"página de precios"," a veces está por debajo de esa cifra y nunca por\nencima. Cómo se toma, se comprueba y se devuelve una copia está dibujado paso a\npaso en la ",[189,463,465],{"href":464},"\u002Fsupabase-backups","página de copias de Supabase",[10,467,468],{},"El resto de lo que llevan esas listas es trabajo de verdad y no este trabajo. La\nmonitorización de errores te dice cuándo se rompe tu app, y eso es operaciones.\n\"Quita las dependencias sin usar\" es orden doméstico. \"Usa contraseñas fuertes\"\nvale para todo aquello donde hayas iniciado sesión alguna vez.",[28,470,472],{"id":471},"cada-cuánto-debo-repetir-esto","¿Cada cuánto debo repetir esto?",[10,474,475],{},"Después de cada despliegue que tocara tus reglas de base de datos, tus claves o\ntus ajustes de compilación. Si eso suena a casi todos los despliegues, suele\nserlo, y ahí está el problema real de una lista que se recorre una vez.",[10,477,478],{},"La vuelta al avión ocurre antes de cada vuelo justo por esto. Row Level Security\nse apaga a medianoche para que una página cargue y nadie la vuelve a encender.\nSe pega una clave en el frontend para sacar una función antes de una demo. Se\nabre un bucket para una subida y se queda abierto. Cada una de esas cosas es un\nmartes normal, y cada una basta para convertir un resultado limpio en uno serio.",[10,480,481,484],{},[189,482,483],{"href":455},"Reeve Monitor"," existe para esa brecha. Repite las nueve\ncomprobaciones cada hora en hasta tres apps, mira cada 60 segundos si la app\nestá en pie, te avisa el día en que un resultado cambia en lugar de esperar a\nque mires, y manda un informe mensual en lenguaje llano. Cuesta $12 al mes de\nprecio de lista, con siete días gratis antes de cobrar, y la página de precios a\nveces está por debajo de esa cifra y nunca por encima. Monitor vigila y nada\nmás. Las copias de seguridad son el plan Care que hay por encima, y Care guarda\nuna copia de una base de datos de Supabase y de nada más.",[28,486,488],{"id":487},"qué-no-demuestra-nada-de-esto","Qué no demuestra nada de esto",[10,490,491],{},"Que tu app es segura. Nueve comprobaciones que vuelven limpias significan que\nnueve preguntas hechas desde fuera volvieron limpias el día en que las hiciste.",[10,493,494],{},"Cuatro cosas siguen siendo invisibles para cada punto de esta lista, porque\nninguna sale jamás de tu servidor. Tu código de servidor, incluidas las\nfunciones de base de datos y las edge functions que nadie de fuera puede leer.\nLas variables de entorno que mantuviste fuera del navegador, que es exactamente\ndonde deben estar y también por qué un escaneo no puede confirmar que estén bien\nguardadas. Tu historial de versiones, donde sigue sentada una clave que subiste\nen marzo y quitaste en abril. Y la lógica propia de tu app, como si un usuario\ncon sesión iniciada puede abrir el pedido de otro cambiando un número en la\ndirección.",[496,497,499],"callout",{"type":498},"warn",[10,500,501,504],{},[17,502,503],{},"Una comprobación externa automática no es una auditoría."," La ausencia de un\nhallazgo no es una garantía, y nada de esta página es un veredicto sobre tu app\nen conjunto. Si tu app acepta pagos o guarda datos de salud o financieros de\nalguien, una prueba de penetración hecha por una persona es otro ejercicio y con\nel tiempo el correcto.",[10,506,507,511],{},[189,508,510],{"href":509},"\u002Fblog\u002Fvibe-coding-security-scanner","Qué puede ver y qué no un escaneo por URL","\nrecorre esa frontera como es debido, incluidas las tres herramientas que leen\ncosas distintas y dónde está ciega cada una.",[28,513,515],{"id":514},"qué-hacer-ahora-mismo","Qué hacer ahora mismo",[517,518,519],"key-takeaways",{},[520,521,522,540,543,546,549],"ul",{},[523,524,525,526,76,528,76,530,111,532,534,535,111,537,539],"li",{},"Haz las cuatro urgentes en orden: busca en tu proyecto ",[73,527,75],{},[73,529,79],{},[73,531,82],{},[73,533,85],{},"; abre el Security Advisor en Supabase; abre ",[73,536,110],{},[73,538,114],{}," en una ventana privada; lee la columna Public y las políticas en Storage.",[523,541,542],{},"Si encuentras una clave secreta, rótala antes de quitarla. Borrar la clave de tu código deja el valor antiguo funcionando, y sigue estando en tu historial de versiones y en cualquier copia en caché de tu sitio.",[523,544,545],{},"Haz las cinco restantes cuando no haya nada ardiendo. Tres son de tu alojamiento, y las dos fechas van en tu calendario.",[523,547,548],{},"Pon una copia de seguridad donde tu cuenta de Supabase no pueda borrarla, y restáurala una vez para saber que funciona.",[523,550,551],{},"Recorre la lista entera otra vez después de cualquier despliegue que tocara tu base de datos, tus claves o tus ajustes de compilación.",[10,553,554,555,559,560,564],{},"Si tu app guarda sus datos en Supabase, la versión escrita alrededor de ese\núnico stack es la ",[189,556,558],{"href":557},"\u002Fis-your-supabase-app-safe","guía de apps de Supabase",". Y si\nprefieres algo para marcar en lugar de algo para leer, la\n",[189,561,563],{"href":562},"\u002Fchecklist","lista de seguridad de 10 minutos"," es la versión interactiva.",{"title":566,"searchDepth":567,"depth":567,"links":568},"",3,[569,571,577,584,585,586,587],{"id":30,"depth":570,"text":31},2,{"id":196,"depth":570,"text":197,"children":572},[573,574,575,576],{"id":212,"depth":567,"text":213},{"id":262,"depth":567,"text":263},{"id":290,"depth":567,"text":291},{"id":322,"depth":567,"text":323},{"id":345,"depth":570,"text":346,"children":578},[579,580,581,582,583],{"id":355,"depth":567,"text":356},{"id":373,"depth":567,"text":374},{"id":391,"depth":567,"text":392},{"id":409,"depth":567,"text":410},{"id":419,"depth":567,"text":420},{"id":434,"depth":570,"text":435},{"id":471,"depth":570,"text":472},{"id":487,"depth":570,"text":488},{"id":514,"depth":570,"text":515},"Fundamentos de seguridad","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcover-1200x630.png","Una lista de nueve renglones rayados, cada uno con una casilla vacía al lado, ninguna marcada todavía.","Una lista de seguridad del vibe coding con nueve puntos, cada uno verificable en tu app desde fuera por cualquiera, y cada uno con una prueba de una línea.",false,"md",[595,598,601,604,607,610],{"q":596,"a":597},"¿Qué debo comprobar antes de lanzar una app hecha con vibe coding?","Cuatro cosas, en este orden: si una clave secreta llegó al código que tu app envía a los navegadores, si tus tablas de base de datos responden a una petición sin nadie con sesión iniciada, si archivos como \u002F.env se abren directamente desde tu dirección en marcha, y si tus buckets de almacenamiento listan lo que subieron tus usuarios. En esos cuatro es donde un desconocido llega a tus datos o a tu dinero. Los otros cinco puntos de la lista merecen la pena y ninguno es motivo para retrasar un lanzamiento.",{"q":599,"a":600},"¿Cuánto tiempo lleva esto?","Tres de los cuatro urgentes son una mirada cada uno en cuanto sabes dónde mirar: una búsqueda en tu propio proyecto de cuatro prefijos de clave, la página de Advisors en Supabase y dos direcciones escritas en una ventana privada. La de la base de datos lleva tanto como tablas tengas, porque lees la política de cada una. Nuestro escaneo gratuito hace las nueve desde fuera en unos 20 segundos sin cuenta, que es el atajo honesto para una primera pasada.",{"q":602,"a":603},"¿Necesito un programador para algo de esto?","Para las pruebas, no. Cada una de las nueve es una página de un panel, una dirección en tu navegador o una búsqueda en tu propio proyecto. Con los arreglos la cosa cambia: mover a un servidor el trabajo que necesitaba una clave secreta es desarrollo de verdad, y escribir una política de seguridad por filas que deje entrar a quien debe es la parte que la mayoría de los dueños delega. Hacer las pruebas tú sigue mereciendo la pena, porque lo que encuentres decide lo que pides.",{"q":605,"a":606},"¿Cuál es el punto más importante?","Si tus tablas de base de datos le responden a un desconocido. Es el punto donde los datos en juego son de tus usuarios y no tuyos, y es el hallazgo serio más común que vemos. De las apps cuyo proyecto de Supabase respondió a nuestro escaneo entre el 12 y el 14 de agosto de 2026, el 57 % tenía al menos una tabla entregando filas a una petición sin nadie con sesión iniciada. Una clave secreta en el bundle hace más daño cuando ocurre, y ocurre mucho menos.",{"q":608,"a":609},"¿Cada cuánto debo repetirlo?","Después de cualquier despliegue que tocara tus reglas de base de datos, tus claves o tus ajustes de compilación, y una vez al mes el resto del tiempo. Un resultado describe la app que estaba en marcha cuando preguntaste. La seguridad por filas se apaga para que una página cargue y se queda apagada, se pega una clave para sacar una función esta noche, se abre un bucket para una subida. Ninguna de esas cosas se anuncia sola.",{"q":611,"a":612},"¿Pasar esto significa que mi app es segura?","No. Significa que nueve preguntas hechas desde fuera volvieron limpias el día en que las hiciste. Una comprobación externa automática no es una auditoría, y la ausencia de un hallazgo no es una garantía. Todo lo que corre en tu servidor es invisible para las nueve: tu código de servidor, las claves que mantuviste fuera del navegador, la clave que subiste en marzo y borraste en abril, y si un usuario con sesión iniciada puede abrir el pedido de otro cambiando un número en la dirección.","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcard-800x500.png",[615,616,617,618,619,620,621,622,623],"lista de seguridad vibe coding","checklist seguridad app vibe coded","checklist seguridad app con ia","lista seguridad lovable","seguridad bolt antes de lanzar","checklist lanzamiento app hecha con ia","comprobacion de seguridad antes de lanzar","mi app esta lista para lanzar seguridad","checklist produccion vibe coding",{},true,"La lista de seguridad del vibe coding","\u002Fblog\u002Fvibe-coded-app-security-checklist","2026-09-20",{"title":5,"description":591},"blog\u002Fvibe-coded-app-security-checklist",[632,633,634],"Una lista de seguridad del vibe coding solo sirve si puedes terminarla. Esta tiene nueve puntos, porque nueve es la cantidad de cosas que cualquiera puede verificar en una app en marcha desde fuera.","Cuatro de ellos deciden si un desconocido llega a tus datos o a tu dinero. Haz esos cuatro antes de pasarle la dirección a nadie.","Los otros cinco son ajustes y fechas. Van en la lista, y ninguno entrega por sí solo una fila de tu base de datos.","Bx3Me8PINDeSVaGs4diXMfVDqp4iLHjpq5Iwt8cXQHc",[637,644,650,656,657,663,669,675,681,687,693,699,705,711,716,721,726,732,738,743,748,754,759,765,771,777,783,789,795,800,806,812,817,823,829,835,839,845,851,856,861,866],{"path":638,"title":639,"description":640,"published":641,"category":642,"image":643,"draft":592},"\u002Fblog\u002Fsupabase-backup-auth-users","Por qué tu dump de Supabase no tiene usuarios dentro","Ejecuta supabase db dump por sí solo y obtienes la forma de tu base de datos y ninguna de sus filas, sin el esquema auth donde viven tus usuarios.","2026-09-23","Backups","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":645,"title":646,"description":647,"published":648,"category":588,"image":649,"draft":592},"\u002Fblog\u002Fdomain-and-certificate-expiry","Dominio caducado, web caída: qué pasa a partir de ahora","Tu dominio caducó y tu web está caída. Aquí tienes el reloj que acaba de arrancar, por qué el certificado es el menor problema, y cómo comprobar ambos.","2026-09-22","\u002Fblog\u002Fdomain-and-certificate-expiry\u002Fcard-800x500.png",{"path":651,"title":652,"description":653,"published":654,"category":588,"image":655,"draft":592},"\u002Fblog\u002Fis-lovable-safe","¿Es seguro Lovable? Lo que vimos en 18.554 aplicaciones Lovable","¿Es seguro Lovable? Pasamos 18.554 aplicaciones Lovable por nueve comprobaciones. La plataforma fue la más limpia de cinco. Los hallazgos estaban dentro.","2026-09-21","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",{"path":627,"title":5,"description":591,"published":628,"category":588,"image":613,"draft":592},{"path":658,"title":659,"description":660,"published":661,"category":588,"image":662,"draft":592},"\u002Fblog\u002Fstripe-secret-key-in-frontend","Una clave secreta de Stripe en tu frontend puede mover dinero","Una clave secreta de Stripe expuesta en tu frontend puede reembolsar, cobrar y leer cada ficha de cliente que tienes. Tu clave pk_live_ sí debe estar ahí.","2026-09-19","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcard-800x500.png",{"path":664,"title":665,"description":666,"published":667,"category":588,"image":668,"draft":592},"\u002Fblog\u002Fvite-and-next-public-env-vars","Variables de entorno de Vite expuestas: el prefijo dice publica esto","Variables de entorno de Vite expuestas en tu app: hicieron lo que pedía el prefijo. VITE_ y NEXT_PUBLIC_ significan publica esto, y la IA nunca supo el coste.","2026-09-18","\u002Fblog\u002Fvite-and-next-public-env-vars\u002Fcard-800x500.png",{"path":670,"title":671,"description":672,"published":673,"category":588,"image":674,"draft":592},"\u002Fblog\u002Fbase44-source-maps","Seguridad en Base44: qué marca un escaneo y qué te toca arreglar a ti","Seguridad en Base44 en 5.438 apps escaneadas: tres hallazgos en casi todas son de la plataforma, el source map es la insignia de Base44 y lo tuyo es poco.","2026-09-17","\u002Fblog\u002Fbase44-source-maps\u002Fcard-800x500.png",{"path":676,"title":677,"description":678,"published":679,"category":588,"image":680,"draft":592},"\u002Fblog\u002Fis-cursor-ai-safe","¿Es seguro Cursor AI? El editor, el código y la app que publicaste","¿Es seguro Cursor AI? Tres preguntas en una búsqueda: qué guarda Cursor, en qué falla el código que escribe y si la app que publicaste está abierta.","2026-09-16","\u002Fblog\u002Fis-cursor-ai-safe\u002Fcard-800x500.png",{"path":682,"title":683,"description":684,"published":685,"category":588,"image":686,"draft":592},"\u002Fblog\u002Fis-replit-safe","¿Es seguro Replit? Lo que vimos en 3.042 aplicaciones Replit en vivo","¿Es seguro Replit? Pasamos 3.042 aplicaciones Replit en vivo por nueve comprobaciones externas. Los hallazgos estaban en la aplicación publicada, no en el host.","2026-09-15","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",{"path":688,"title":689,"description":690,"published":691,"category":642,"image":692,"draft":592},"\u002Fblog\u002Fsupabase-storage-backup","Supabase storage backup: tu copia de la base no tiene archivos","Un Supabase storage backup es una tarea aparte. Las copias de la base guardan la lista de tus archivos y ninguno de ellos, así que cada upload queda roto.","2026-09-14","\u002Fblog\u002Fsupabase-storage-backup\u002Fcard-800x500.png",{"path":694,"title":695,"description":696,"published":697,"category":642,"image":698,"draft":592},"\u002Fblog\u002Fsupabase-point-in-time-recovery","Point-in-time recovery de Supabase: precio y límites","El point-in-time recovery de Supabase rebobina tu base de datos a cualquier segundo de la última semana. Cuesta $100 al mes sobre Pro y solo cubre la base.","2026-09-13","\u002Fblog\u002Fsupabase-point-in-time-recovery\u002Fcard-800x500.png",{"path":700,"title":701,"description":702,"published":703,"category":642,"image":704,"draft":592},"\u002Fblog\u002Fsupabase-project-paused-recover","¿Proyecto de Supabase pausado? Tus datos siguen ahí","Supabase pausó tu proyecto tras una semana sin actividad. No se ha borrado nada, Restaurar está junto al nombre y tienes un año antes de que eso cambie.","2026-09-12","\u002Fblog\u002Fsupabase-project-paused-recover\u002Fcard-800x500.png",{"path":706,"title":707,"description":708,"published":709,"category":588,"image":710,"draft":592},"\u002Fblog\u002Fsafest-ai-app-builder","¿Qué builder de apps con IA es más seguro? 30.998 apps escaneadas","¿Qué builder de apps con IA es más seguro? Escaneamos 30.998 apps activas de Lovable, Base44, Replit, v0 y Bolt. El builder no es lo que decide tu nota.","2026-09-11","\u002Fblog\u002Fsafest-ai-app-builder\u002Fcard-800x500.png",{"path":280,"title":712,"description":713,"published":714,"category":588,"image":715,"draft":592},"Activa Row Level Security en cada tabla de Supabase y compruébalo","Activar Row Level Security en Supabase sin política cierra la tabla del todo. Una política sin el interruptor no hace nada. Aquí tienes el SQL y la prueba.","2026-09-10","\u002Fblog\u002Fenable-rls-on-every-supabase-table\u002Fcard-800x500.png",{"path":269,"title":717,"description":718,"published":719,"category":588,"image":720,"draft":592},"Supabase \"RLS disabled in public\": lo que el aviso no ve","Supabase marca \"RLS disabled in public\" como error. No dice nada de la política de lectura que deja tu tabla igual de abierta a cualquiera.","2026-09-09","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Fcard-800x500.png",{"path":257,"title":722,"description":723,"published":724,"category":588,"image":725,"draft":592},"Cómo rotar una clave service_role de Supabase filtrada","Supabase dice que primero cierres la fuga. Otras guías dicen que rotes ya. Cuál es lo correcto depende de dónde se filtró tu clave service_role.","2026-09-08","\u002Fblog\u002Frotate-supabase-service-role-key\u002Fcard-800x500.png",{"path":727,"title":728,"description":729,"published":730,"category":588,"image":731,"draft":592},"\u002Fblog\u002Fvibe-coding-security-scanners-compared","Escáneres de seguridad vibe coding comparados, el nuestro incluido","El mejor escáner de seguridad para vibe coding depende de tres preguntas que ninguna lista de funciones responde. Diez herramientas, con precios.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":733,"title":734,"description":735,"published":736,"category":588,"image":737,"draft":592},"\u002Fblog\u002Fsupabase-security-checker","Supabase security checker: haz tú mismo las cinco comprobaciones","Un Supabase security checker lee tu app publicada en lugar de la configuración de tu proyecto. Estas son las cinco comprobaciones y cómo hacer cada una.","2026-09-06","\u002Fblog\u002Fsupabase-security-checker\u002Fcard-800x500.png",{"path":509,"title":739,"description":740,"published":741,"category":588,"image":742,"draft":592},"Escáner de seguridad para vibe coding: qué se le escapa","Un escáner de seguridad para vibe coding lee tu app en vivo desde fuera. Qué cubre eso, las cuatro cosas que no puede ver y cómo leer el resultado.","2026-09-05","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",{"path":368,"title":744,"description":745,"published":746,"category":588,"image":747,"draft":592},"Faltan cabeceras de seguridad: cuándo importa de verdad","Que falten cabeceras de seguridad es el hallazgo que más imprime nuestro escáner. Contra qué protegen y cuándo son la línea menos urgente de tu informe.","2026-09-04","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",{"path":749,"title":750,"description":751,"published":752,"category":588,"image":753,"draft":592},"\u002Fblog\u002Fopenai-api-key-exposed-in-frontend","Tu clave de API de OpenAI está expuesta en tu frontend. Rótala.","Una clave de API de OpenAI expuesta en tu frontend no se puede atar a un dominio. Rótala hoy, mueve la llamada a tu servidor y limita el gasto.","2026-09-03","\u002Fblog\u002Fopenai-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":317,"title":755,"description":756,"published":757,"category":588,"image":758,"draft":592},"Clave de API expuesta en el frontend: qué llevan 30.998 apps","Una clave de API expuesta en tu frontend suele ser una clave de Google Maps. Escaneamos 30.998 apps vibe-coded y contamos qué secretos se filtran de verdad.","2026-09-02","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fcard-800x500.png",{"path":760,"title":761,"description":762,"published":763,"category":642,"image":764,"draft":592},"\u002Fblog\u002Fsupabase-backup-tools-compared","Herramientas de backup de Supabase comparadas, la nuestra incluida","Cuatro tipos de herramienta de backup de Supabase, qué copia cada una y cuándo una GitHub Action gratuita le gana a pagar a cualquiera, nosotros incluidos.","2026-09-01","\u002Fblog\u002Fsupabase-backup-tools-compared\u002Fcard-800x500.png",{"path":766,"title":767,"description":768,"published":769,"category":588,"image":770,"draft":592},"\u002Fblog\u002Freplit-secrets-explained","Cómo usar secrets en Replit, y qué se publica de todos modos","Cómo usar secrets en Replit: añadir uno, leerlo y arreglar las dos causas del undefined. Y las claves que la herramienta Secrets no puede mantener privadas.","2026-08-31","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",{"path":772,"title":773,"description":774,"published":775,"category":642,"image":776,"draft":592},"\u002Fblog\u002Fback-up-supabase-free-tier","Backups del plan gratuito de Supabase: cómo hacer uno sin terminal","No hay backups en el plan gratuito de Supabase: la copia tienes que hacerla tú. Cómo sacarla desde el panel y qué deja fuera la vía CSV.","2026-08-30","\u002Fblog\u002Fback-up-supabase-free-tier\u002Fcard-800x500.png",{"path":778,"title":779,"description":780,"published":781,"category":588,"image":782,"draft":592},"\u002Fblog\u002Fis-supabase-secure","¿Supabase es seguro? Sí. Tu proyecto es otra pregunta","¿Supabase es seguro? La plataforma está auditada, cifrada y sometida a pentests. Su propia documentación dice dónde termina eso y empiezan tus ajustes.","2026-08-29","\u002Fblog\u002Fis-supabase-secure\u002Fcard-800x500.png",{"path":784,"title":785,"description":786,"published":787,"category":588,"image":788,"draft":592},"\u002Fblog\u002Fwhere-to-find-supabase-api-keys","Dónde están tus claves API de Supabase: anon, service_role y URL","La URL del proyecto, la clave anon y la clave service_role están en una sola página del panel. Aquí tienes dónde está, y cuál de los cuatro va en tu app.","2026-08-28","\u002Fblog\u002Fwhere-to-find-supabase-api-keys\u002Fcard-800x500.png",{"path":790,"title":791,"description":792,"published":793,"category":588,"image":794,"draft":592},"\u002Fblog\u002Fnew-row-violates-row-level-security-policy","New row violates row-level security policy en Supabase. ¿Y ahora?","\"New row violates row-level security policy\" significa que Supabase rechazó una escritura. El arreglo rápido vuelve a abrir la tabla para cualquiera.","2026-08-27","\u002Fblog\u002Fnew-row-violates-row-level-security-policy\u002Fcard-800x500.png",{"path":404,"title":796,"description":797,"published":798,"category":588,"image":799,"draft":592},"¿Es un comodín CORS un riesgo de seguridad? Casi nunca.","¿Es un comodín CORS un riesgo de seguridad? Casi siempre es el ajuste por defecto de tu builder y no entrega nada que tu servidor no diera ya a cualquiera.","2026-08-26","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",{"path":801,"title":802,"description":803,"published":804,"category":642,"image":805,"draft":592},"\u002Fblog\u002Fsupabase-branching-is-not-a-backup","Supabase branching no es un backup. Solo va hacia adelante.","Por qué el branching de Supabase no es un backup: una rama arranca sin tus datos y un merge solo mueve el esquema. Para qué sirve y qué usar en su lugar.","2026-08-25","\u002Fblog\u002Fsupabase-branching-is-not-a-backup\u002Fcard-800x500.png",{"path":807,"title":808,"description":809,"published":810,"category":642,"image":811,"draft":592},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","Cómo restaurar un backup de Supabase, y qué se rompe después","Cómo restaurar un backup de Supabase desde el panel o desde un archivo de volcado, qué reemplaza la restauración y por qué tu app puede seguir rota al terminar.","2026-08-24","\u002Fblog\u002Fhow-to-restore-a-supabase-backup\u002Fcard-800x500.png",{"path":340,"title":813,"description":814,"published":815,"category":588,"image":816,"draft":592},"Tu bucket de Supabase Storage es público. ¿Es un problema?","Un bucket público de Supabase Storage significa que quien tenga la URL de un archivo puede abrirlo. No significa que alguien pueda listar lo que hay dentro.","2026-08-23","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",{"path":818,"title":819,"description":820,"published":821,"category":588,"image":822,"draft":592},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","¿Es un problema una clave de API de Google en tu frontend?","Una clave de API de Google en tu frontend es la clave que más encuentra nuestro escáner, y casi siempre no pasa nada. Un ajuste gratuito decide cuál es cuál.","2026-08-22","\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":824,"title":825,"description":826,"published":827,"category":642,"image":828,"draft":592},"\u002Fblog\u002Fai-agent-deleted-my-database","Un agente de IA borró mis datos de Supabase. ¿Qué puedo recuperar?","Un agente de IA borró datos de tu base. Lo que puedes recuperar ya estaba decidido antes de que se ejecutara, y los próximos minutos deciden el resto.","2026-08-21","\u002Fblog\u002Fai-agent-deleted-my-database\u002Fcard-800x500.png",{"path":830,"title":831,"description":832,"published":833,"category":588,"image":834,"draft":592},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","¿Puede cualquiera leer tu base de datos Supabase? 3.680 apps","¿Puede cualquiera leer tu base de datos Supabase sin iniciar sesión? Escaneamos 30.998 apps activas hechas con builders de IA y medimos cuántas dicen que sí.","2026-08-18","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fcard-800x500.png",{"path":386,"title":836,"description":837,"published":833,"category":588,"image":838,"draft":592},"Source maps expuestos: tu app está publicando su código original","Un source map expuesto deja que cualquiera lea el código original de tu app, comentarios incluidos. La comprobación de 30 segundos y lo que de verdad importa.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",{"path":840,"title":841,"description":842,"published":843,"category":588,"image":844,"draft":592},"\u002Fblog\u002Fsupabase-new-api-keys","Las nuevas claves de API de Supabase: ¿cuál va en tu app?","Supabase sustituyó anon y service_role por claves publicables y secretas. ¿Cuál pertenece a tu app y cuál no debe estar nunca?","2026-08-12","\u002Fblog\u002Fsupabase-new-api-keys\u002Fcard-800x500.png",{"path":846,"title":847,"description":848,"published":849,"category":642,"image":850,"draft":592},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","¿Supabase respalda mi base de datos? Depende de tu plan.","¿Supabase respalda tu base de datos? A diario en los planes de pago, y nada en el gratuito. Cómo saber cuál tienes y qué es lo que esa copia no cubre.","2026-08-11","\u002Fblog\u002Fdoes-supabase-back-up-my-database\u002Fcard-800x500.png",{"path":285,"title":852,"description":853,"published":854,"category":588,"image":855,"draft":592},"Supabase Row Level Security está activado. Tu tabla sigue pública.","Activar Supabase Row Level Security no protege una tabla. Lo hacen tus políticas, y la que arregló tu app rota puede dejar entrar a cualquiera.","2026-08-10","\u002Fblog\u002Fsupabase-rls-on-but-table-still-public\u002Fcard-800x500.png",{"path":857,"title":858,"description":859,"published":854,"category":642,"image":860,"draft":592},"\u002Fblog\u002Fversion-history-is-not-a-backup","El historial de versiones no es un backup. No recupera una tabla.","Lovable y Bolt guardan un historial de versiones de tu código. Tu base de datos es un servicio aparte, y volver atrás no te devuelve tus datos.","\u002Fblog\u002Fversion-history-is-not-a-backup\u002Fcard-800x500.png",{"path":447,"title":862,"description":863,"published":864,"category":642,"image":865,"draft":592},"Tres formas de respaldar una base Supabase, y qué falta en cada una","El panel, pg_dump y un servicio gestionado. Qué guarda de verdad cada uno, qué deja fuera sin avisar y cuál sobrevive a perder la cuenta.","2026-08-09","\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database\u002Fcard-800x500.png",{"path":239,"title":867,"description":868,"published":864,"category":588,"image":869,"draft":592},"Qué claves de API son seguras en el navegador y cuáles no","Tu clave anon de Supabase está pensada para ser pública. Tu clave service_role no, y se salta todas las reglas que pongas. Cómo distinguirlas.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",1790150954053]