[{"data":1,"prerenderedAt":663},["ShallowReactive",2],{"blog-es-what-secrets-leak-from-vibe-coded-apps":3,"blog-index-es":422},{"id":4,"title":5,"body":6,"category":381,"cover":382,"coverAlt":383,"description":384,"draft":385,"extension":386,"faq":387,"image":403,"keywords":404,"meta":410,"navigation":411,"ogTitle":412,"path":413,"published":414,"seo":415,"stem":416,"tldr":417,"updated":414,"__hash__":421},"blog_es\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps.md","Clave de API expuesta en el frontend: qué llevan 30.998 apps",{"type":7,"value":8,"toc":369},"minimark",[9,13,16,21,24,33,45,49,52,59,69,75,86,90,93,180,183,189,200,208,212,218,238,243,249,253,256,270,278,282,300,309,312,327,331,357],[10,11,12],"p",{},"Alguien abre tu app, pulsa F12 y te dice que hay una clave de API expuesta en tu\nfrontend. La palabra que usa suele ser «filtrada». Rara vez dice de qué clave se\ntrata, y los consejos que encuentras después tratan todas como la misma\nemergencia.",[10,14,15],{},"No son la misma emergencia, y ahora podemos poner cifras a la distancia. Entre el\n12 y el 14 de agosto de 2026 pasamos nueve comprobaciones externas a 30.998 apps\nen funcionamiento creadas con Lovable, Bolt, v0, Replit y Base44, y leímos el\nJavaScript que cada una entrega a un navegador. Esto es lo que había dentro.",[17,18,20],"h2",{"id":19},"una-clave-de-api-expuesta-en-el-frontend-es-realmente-un-problema","¿Una clave de API expuesta en el frontend es realmente un problema?",[10,22,23],{},"Casi nunca, y la forma de ese «casi nunca» está más desequilibrada de lo que\nesperábamos.",[10,25,26,27,32],{},"Encontramos una clave digna de mención en 1.332 de las 30.998 apps. En 1.080 de\nellas lo único que encontramos fue una clave de API de Google, que son\nprecisamente las credenciales\n",[28,29,31],"a",{"href":30},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","que deben estar en tu página",". Lo que\nprotege a esa es un ajuste guardado del lado de Google, y esconderla nunca formó\nparte del acuerdo.",[10,34,35,36,40,41,44],{},"Las otras 29.666 apps no entregaban nada que nuestra comprobación de secretos\ntrate como un problema. Esa cifra necesita una matización para ser honesta: las\nclaves publicables quedan fuera. Una clave ",[37,38,39],"code",{},"anon"," de Supabase o una clave ",[37,42,43],{},"pk_","\nde Stripe pertenece al navegador, así que la marcamos como algo que hiciste bien\ny nunca entra en estos recuentos.",[17,46,48],{"id":47},"qué-contamos-y-qué-no-pudimos-contar","Qué contamos y qué no pudimos contar",[10,50,51],{},"Cargamos cada app como lo hace un visitante, en un navegador real, y leímos el\nJavaScript que descargaba. Todo lo que sigue es una forma encontrada en ese\ncódigo.",[10,53,54,58],{},[55,56,57],"strong",{},"Reconocemos los formatos de clave que conocemos."," Stripe, OpenAI, Anthropic,\nAWS, Google y Supabase tienen prefijos identificables, y un JWT de Supabase\ndeclara su propio rol en texto legible en la sección central. Unas credenciales\nen un formato que no reconocemos no están en estas cifras, así que léelas como un\nsuelo.",[10,60,61,64,65,68],{},[55,62,63],{},"No usamos ninguna clave que encontramos."," Ni una sola vez, en ninguna app.\nAnotamos el tipo y una pista enmascarada de la forma ",[37,66,67],{},"sk_live_…a1b2",", y el valor\nreal no se escribió en ninguna parte.",[10,70,71,74],{},[55,72,73],{},"No se nombra ninguna app."," Ni aquí, ni en el conjunto de datos, ni en nada que\npubliquemos.",[10,76,77,80,81,85],{},[55,78,79],{},"Casi todas son apps publicadas en el dominio propio de un builder."," El método\ncompleto, la muestra y cada cifra detrás de este artículo están en\n",[28,82,84],{"href":83},"\u002Fresearch\u002Fvibe-coded-app-security-2026","nuestro informe de escaneo",", incluido lo\nque no pudimos medir.",[17,87,89],{"id":88},"qué-entregaban-en-realidad-las-30998-apps","Qué entregaban en realidad las 30.998 apps",[10,91,92],{},"Una tabla, ordenada por la frecuencia con que vimos cada cosa. La comprobación de\nsecretos se completó en todas y cada una de las 30.998 apps, así que cada\nrecuento de abajo es sobre todas ellas.",[94,95,96,109],"table",{},[97,98,99],"thead",{},[100,101,102,106],"tr",{},[103,104,105],"th",{},"Lo que encontramos en el código del navegador",[103,107,108],{},"Apps",[110,111,112,121,129,137,145,153,165,172],"tbody",{},[100,113,114,118],{},[115,116,117],"td",{},"Clave de API de Google",[115,119,120],{},"1.142",[100,122,123,126],{},[115,124,125],{},"Un valor de alta entropía junto a un nombre «secret» o «password»",[115,127,128],{},"204",[100,130,131,134],{},[115,132,133],{},"Clave de OpenAI",[115,135,136],{},"33",[100,138,139,142],{},[115,140,141],{},"Clave de acceso de AWS",[115,143,144],{},"9",[100,146,147,150],{},[115,148,149],{},"Clave de Anthropic",[115,151,152],{},"5",[100,154,155,162],{},[115,156,157,158,161],{},"Clave ",[37,159,160],{},"service_role"," de Supabase",[115,163,164],{},"3",[100,166,167,170],{},[115,168,169],{},"Clave secreta de Stripe",[115,171,164],{},[100,173,174,177],{},[115,175,176],{},"Clave restringida de Stripe",[115,178,179],{},"2",[10,181,182],{},"Las filas suman más de 1.332 porque una app puede llevar dos de estas. Ordena\nesas mismas 1.332 apps en grupos que no se solapan y el cuadro se vuelve más\nnítido: 1.080 tenían una clave de Google y nada más, 198 tenían un valor de alta\nentropía que puede ser o no unas credenciales reales, y 54 tenían una clave que\nes un secreto genuino por su propia forma.",[184,185],"diagram",{"alt":186,"caption":187,"src":188},"Una sola barra ancha que representa las 1.332 apps donde se encontró una clave, dividida en tres partes: una sección turquesa larga de 1.080, una sección ámbar más corta de 198 y una estrecha sección roja de 54 en el extremo derecho.","Cada app donde encontramos alguna clave, ordenada en tres grupos que no se solapan. La sección roja es de la que hablan los avisos.","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fwhat-we-found-1600x620.png",[10,190,191,192,195,196,199],{},"El segundo grupo merece describirse con cuidado. Un valor de alta entropía junto\na una palabra como ",[37,193,194],{},"secret"," o ",[37,197,198],{},"password"," puede ser una credencial viva, o puede\nser un identificador de sesión, un hash de compilación o un token público con un\nnombre desafortunado. Lo señalamos como algo que conviene mirar, y desde fuera\nnadie puede decirte cuál de esas cosas es.",[10,201,202,203,207],{},"Las 54 del tercer grupo son lo auténtico. Todas menos dos salieron con nota D o\nF, porque un solo hallazgo crítico limita la nota a D por muy bien que la app\nhaya hecho todo lo demás. El grupo más grande dentro de ellas es la clave de\nOpenAI, con 33, y esa\n",[28,204,206],{"href":205},"\u002Fblog\u002Fopenai-api-key-exposed-in-frontend","no tiene ninguna opción que la haga segura en un navegador",".",[17,209,211],{"id":210},"la-clave-contra-la-que-todos-advierten-fue-lo-más-raro-que-encontramos","La clave contra la que todos advierten fue lo más raro que encontramos",[10,213,214,215,217],{},"Tres apps. Esas son las que entregaban una clave ",[37,216,160],{}," de Supabase, la\nque se salta cada regla de tabla que hayas escrito. Una clave secreta de Stripe\napareció también tres veces.",[10,219,220,221,223,224,227,228,227,231,234,235,207],{},"Ponlo frente a la otra mitad del mismo barrido. De las apps que escaneamos, 8.429\nnombraban un proyecto de Supabase, y los dos hallazgos caen dentro de ese mismo\ngrupo. Tres de ellas entregaban la clave ",[37,222,160],{},". En 2.096 de ellas, al\nmenos una tabla respondió a una petición sin ningún inicio de sesión, y en 394\nesa tabla llevaba un nombre de personas: ",[37,225,226],{},"users",", ",[37,229,230],{},"profiles",[37,232,233],{},"customers",",\n",[37,236,237],{},"orders",[184,239],{"alt":240,"caption":241,"src":242},"Dos filas dibujadas a la misma escala. La fila superior, marcada con una llave, es una franja roja tan fina que necesita un anillo de puntos para verse, etiquetada con 3. La fila inferior, marcada con una tabla, es una banda turquesa que recorre casi todo el ancho, etiquetada con 2.096.","Ambos recuentos salen de las mismas 8.429 apps con Supabase. La fila de arriba es el hallazgo contra el que se advierte a los dueños.","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fwarned-about-vs-found-1600x680.png",[10,244,245,246,248],{},"Las 2.096 son un suelo. 4.749 de las 8.429 nunca respondieron a nuestra\ncomprobación de base de datos, por razones que no vemos desde fuera, y esas\nquedan registradas como desconocidas en lugar de como limpias. Las tres claves\n",[37,247,160],{}," son un recuento exacto, porque una clave se lee del código que\ncada app entrega.",[17,250,252],{"id":251},"por-qué-los-avisos-apuntan-a-la-clave-equivocada","Por qué los avisos apuntan a la clave equivocada",[10,254,255],{},"Solo vemos el exterior de estas apps, así que no podemos decirte por qué. Lo que\nsí podemos mostrar es qué error sobrevive.",[10,257,258,259,261,262,264,265,269],{},"Copiar la clave equivocada de Supabase es genuinamente fácil. En un proyecto\nantiguo ",[37,260,39],{}," y ",[37,263,160],{}," están una al lado de la otra en el mismo panel\ndel dashboard, tienen la misma longitud y la misma forma, y\n",[28,266,268],{"href":267},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","nada se rompe si coges la equivocada",".\nAun así solo ocurrió tres veces en 30.998 apps, porque nada te empuja hacia ahí.\nPegar cualquiera de las dos hace que la app funcione.",[10,271,272,273,277],{},"La tabla abierta sí tiene una fuerza detrás. Se activa Row Level Security, la app\ndeja de mostrar datos, se escribe una política que permite a todo el mundo para\nque vuelva a funcionar, y desde ese momento el dashboard informa de la tabla como\nprotegida. Activarlo\n",[28,274,276],{"href":275},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","no es lo mismo que estar protegido",".\nNuestro escaneo califica esa tabla como hallazgo crítico un día en que tu\ndashboard te está mostrando el interruptor activado y una política en su sitio.",[17,279,281],{"id":280},"cómo-encontrar-gratis-una-clave-de-api-expuesta-en-tu-app","Cómo encontrar gratis una clave de API expuesta en tu app",[10,283,284,285,288,289,292,293,295,296,299],{},"Empieza a mano, porque cuesta cinco minutos y no necesita instalar nada. Abre tu\nsitio en producción, mira el código fuente de la página y busca cuatro cadenas:\n",[37,286,287],{},"AIza"," para una clave de Google, ",[37,290,291],{},"sk_"," para un secreto de Stripe o de un\nproveedor de modelos, ",[37,294,160],{}," para la clave de Supabase que ignora tus\nreglas, y ",[37,297,298],{},"eyJ"," para cualquier token de Supabase. Todo lo que salga ya está en\nmanos de cada visitante que tienes.",[10,301,302,303,305,306,308],{},"Eso te da la página en sí. Lo que se le escapa es el JavaScript que la página\ncarga después, y por eso nuestro propio escáner abre una app en un navegador real\ny lee los bundles en lugar del HTML. Buscar a mano tampoco puede decirte si el\ntoken ",[37,304,298],{}," que encontraste es la clave ",[37,307,39],{}," o la secreta, porque las dos\ntienen la misma longitud y la misma forma.",[10,310,311],{},"Nuestro escaneo gratuito cubre ambas cosas. Carga tu app en un navegador real,\nlee el código que llega de verdad, decodifica cada token de Supabase e informa\ndel rol escrito dentro, de modo que una clave publicable vuelve marcada como\ncorrecta en lugar de enterrada en un muro de rojo. Obtienes una nota, una\npuntuación y los recuentos en pantalla en unos 20 segundos sin cuenta. Da una\ndirección de correo y obtienes además la lista detallada, con un arreglo escrito\npara tu builder que puedes pegar directamente.",[10,313,314,315,317,318,322,323,207],{},"Tres cosas que no hará, y son las razones por las que es seguro en una app en\nproducción: nunca inicia sesión, nunca escribe nada y nunca se queda con una\nclave que encuentra. Un secreto expuesto se guarda como una pista enmascarada del\ntipo ",[37,316,67],{},", y el valor real se descarta.\n",[28,319,321],{"href":320},"\u002F#scan","Escanea tu app",", o lee primero\n",[28,324,326],{"href":325},"\u002Fsecurity-scanner","qué mira cada una de las nueve comprobaciones",[17,328,330],{"id":329},"qué-hacer-en-el-orden-que-sugieren-las-cifras","Qué hacer, en el orden que sugieren las cifras",[332,333,334],"key-takeaways",{},[335,336,337,345,348,351,354],"ul",{},[338,339,340,341,344],"li",{},"Identifica la clave antes de reaccionar. El prefijo lo resuelve para Stripe y para las claves de Supabase nuevas; en una clave de Supabase antigua decide el campo ",[37,342,343],{},"role"," dentro del token.",[338,346,347],{},"Si es una clave de Google, restríngela en vez de esconderla. Restricción de Sitios web, tu dominio, solo las API que uses, más un tope de cuota diaria. Gratis, unos cinco minutos, sin cambiar código.",[338,349,350],{},"Si es una clave secreta de verdad, rótala primero. Borrarla de tu código no cierra nada, porque el valor antiguo sigue en tu historial de versiones y en las copias en caché de tu sitio.",[338,352,353],{},"Después ve a leer las reglas de tus tablas, que es donde las cifras sitúan la exposición real. Empieza por las tablas que contienen personas.",[338,355,356],{},"Revisa facturación y registros tras cualquier exposición de una clave secreta. Rotar detiene lo que pase a partir de ahora, y no dice nada de lo que ya pasó.",[10,358,359,360,364,365,207],{},"Recorre la lista entera de una sentada con la\n",[28,361,363],{"href":362},"\u002Fchecklist","lista de seguridad de 10 minutos",", que cubre la clave y las reglas\nde tablas junto a las otras cosas que conviene cerrar en una app recién lanzada.\nY si la mitad de base de datos de este artículo es la que te preocupa, tiene su\npropio recuento:\n",[28,366,368],{"href":367},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","quién puede leer tu base de datos de Supabase",{"title":370,"searchDepth":371,"depth":371,"links":372},"",3,[373,375,376,377,378,379,380],{"id":19,"depth":374,"text":20},2,{"id":47,"depth":374,"text":48},{"id":88,"depth":374,"text":89},{"id":210,"depth":374,"text":211},{"id":251,"depth":374,"text":252},{"id":280,"depth":374,"text":281},{"id":329,"depth":374,"text":330},"Fundamentos de seguridad","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fcover-1200x630.png","Una página de código de app con ocho valores con forma de clave resaltados, casi todos corrientes y uno dibujado en rojo.","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.",false,"md",[388,391,394,397,400],{"q":389,"a":390},"¿Cómo sé si mi clave de API se ha filtrado?","Abre tu sitio en producción, mira el código fuente de la página y busca las formas: AIza para una clave de Google, sk_ para un secreto de Stripe o de un proveedor de modelos, y eyJ para un JWT de Supabase. Todo lo que aparezca ya está en manos de cada visitante. Nuestro escaneo gratuito hace esa misma lectura desde fuera e informa de lo que puede ver en unos 20 segundos, sin cuenta para obtener la nota.",{"q":392,"a":393},"¿Una clave de API escrita en el código es siempre un problema de seguridad?","No, y creer lo contrario es justo lo que enseña a la gente a ignorar el aviso. Algunas claves se publican a propósito: una clave anon de Supabase, una clave pk_ de Stripe y una clave de configuración web de Firebase están diseñadas para vivir en el navegador, y lo que protege tus datos son las reglas que hay detrás. Una clave secreta es el caso contrario y su sitio es un servidor. El prefijo te dice cuál de las dos tienes delante.",{"q":395,"a":396},"Me dicen que mi clave de Supabase está expuesta. ¿Es la mala?","Casi con seguridad no. Las dos claves de Supabase se parecen, así que lee el rol dentro del token o comprueba el prefijo: anon y sb_publishable_ están pensadas para ser públicas, service_role y sb_secret_ no. Encontramos una clave service_role en 3 apps de 30.998, así que las probabilidades están muy del lado de la inofensiva. Si resulta ser la secreta, rótala hoy mismo en el panel de Supabase.",{"q":398,"a":399},"¿De qué debería preocuparme en su lugar?","De las reglas sobre las tablas de tu base de datos. De las apps donde pudimos completar esa comprobación, más de la mitad tenía al menos una tabla que respondía a una petición sin ningún inicio de sesión, y en 394 de ellas la tabla abierta llevaba un nombre de personas: users, profiles, customers, orders. Eso es mucho más común que cualquier clave filtrada y mucho más silencioso, porque la app funciona exactamente igual en ambos casos.",{"q":401,"a":402},"He quitado la clave de mi código. ¿Ya está cerrado?","No por sí solo. El valor antiguo sigue existiendo en tu historial de versiones y en cualquier copia en caché de la página, así que quien ya lo recogiera puede seguir usándolo. Lo que cierra de verdad la puerta es rotar la clave en el panel del proveedor, y ese es el primer paso, no el último. Después revisa la facturación y los registros por si hay uso que no puedas explicar.","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fcard-800x500.png",[405,406,407,408,409],"clave de api expuesta en el frontend","secretos en el código del cliente","clave de api en el código","se ha filtrado mi clave de api","encontrar claves de api expuestas",{},true,"Clave de API expuesta en el frontend: 30.998 apps contadas","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","2026-09-02",{"title":5,"description":384},"blog\u002Fwhat-secrets-leak-from-vibe-coded-apps",[418,419,420],"Una clave de API expuesta en tu frontend es casi siempre de la clase inofensiva. Encontramos una clave digna de mención en 1.332 de 30.998 apps, y 1.080 de ellas solo llevaban una clave de API de Google.","La clave service_role de Supabase, contra la que advierte cada tutorial, apareció en 3 apps de 30.998. Una clave secreta de Stripe apareció también en 3.","Las claves que gastan dinero o leen datos por su propia forma aparecieron en 54 apps. Una tabla abierta de Supabase apareció en 2.096.","IopSzATsGfj3MjdLw6CzrYMWxQCX2aA9CVfSrtUETmM",[423,430,436,442,448,454,460,466,472,478,484,490,496,502,508,514,520,526,532,538,544,549,550,556,562,568,574,580,586,592,598,604,610,615,621,626,631,637,643,648,653,659],{"path":424,"title":425,"description":426,"published":427,"category":428,"image":429,"draft":385},"\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":431,"title":432,"description":433,"published":434,"category":381,"image":435,"draft":385},"\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":437,"title":438,"description":439,"published":440,"category":381,"image":441,"draft":385},"\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":443,"title":444,"description":445,"published":446,"category":381,"image":447,"draft":385},"\u002Fblog\u002Fvibe-coded-app-security-checklist","La lista de seguridad del vibe coding, en nueve comprobaciones","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.","2026-09-20","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcard-800x500.png",{"path":449,"title":450,"description":451,"published":452,"category":381,"image":453,"draft":385},"\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":455,"title":456,"description":457,"published":458,"category":381,"image":459,"draft":385},"\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":461,"title":462,"description":463,"published":464,"category":381,"image":465,"draft":385},"\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":467,"title":468,"description":469,"published":470,"category":381,"image":471,"draft":385},"\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":473,"title":474,"description":475,"published":476,"category":381,"image":477,"draft":385},"\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":479,"title":480,"description":481,"published":482,"category":428,"image":483,"draft":385},"\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":485,"title":486,"description":487,"published":488,"category":428,"image":489,"draft":385},"\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":491,"title":492,"description":493,"published":494,"category":428,"image":495,"draft":385},"\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":497,"title":498,"description":499,"published":500,"category":381,"image":501,"draft":385},"\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":503,"title":504,"description":505,"published":506,"category":381,"image":507,"draft":385},"\u002Fblog\u002Fenable-rls-on-every-supabase-table","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":509,"title":510,"description":511,"published":512,"category":381,"image":513,"draft":385},"\u002Fblog\u002Fsupabase-rls-disabled-in-public","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":515,"title":516,"description":517,"published":518,"category":381,"image":519,"draft":385},"\u002Fblog\u002Frotate-supabase-service-role-key","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":521,"title":522,"description":523,"published":524,"category":381,"image":525,"draft":385},"\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":527,"title":528,"description":529,"published":530,"category":381,"image":531,"draft":385},"\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":533,"title":534,"description":535,"published":536,"category":381,"image":537,"draft":385},"\u002Fblog\u002Fvibe-coding-security-scanner","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":539,"title":540,"description":541,"published":542,"category":381,"image":543,"draft":385},"\u002Fblog\u002Fmissing-security-headers","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":205,"title":545,"description":546,"published":547,"category":381,"image":548,"draft":385},"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":413,"title":5,"description":384,"published":414,"category":381,"image":403,"draft":385},{"path":551,"title":552,"description":553,"published":554,"category":428,"image":555,"draft":385},"\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":557,"title":558,"description":559,"published":560,"category":381,"image":561,"draft":385},"\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":563,"title":564,"description":565,"published":566,"category":428,"image":567,"draft":385},"\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":569,"title":570,"description":571,"published":572,"category":381,"image":573,"draft":385},"\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":575,"title":576,"description":577,"published":578,"category":381,"image":579,"draft":385},"\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":581,"title":582,"description":583,"published":584,"category":381,"image":585,"draft":385},"\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":587,"title":588,"description":589,"published":590,"category":381,"image":591,"draft":385},"\u002Fblog\u002Fcors-wildcard-security-risk","¿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":593,"title":594,"description":595,"published":596,"category":428,"image":597,"draft":385},"\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":599,"title":600,"description":601,"published":602,"category":428,"image":603,"draft":385},"\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":605,"title":606,"description":607,"published":608,"category":381,"image":609,"draft":385},"\u002Fblog\u002Fsupabase-storage-bucket-public","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":30,"title":611,"description":612,"published":613,"category":381,"image":614,"draft":385},"¿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":616,"title":617,"description":618,"published":619,"category":428,"image":620,"draft":385},"\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":367,"title":622,"description":623,"published":624,"category":381,"image":625,"draft":385},"¿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":627,"title":628,"description":629,"published":624,"category":381,"image":630,"draft":385},"\u002Fblog\u002Fsource-maps-exposed-in-production","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":632,"title":633,"description":634,"published":635,"category":381,"image":636,"draft":385},"\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":638,"title":639,"description":640,"published":641,"category":428,"image":642,"draft":385},"\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":275,"title":644,"description":645,"published":646,"category":381,"image":647,"draft":385},"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":649,"title":650,"description":651,"published":646,"category":428,"image":652,"draft":385},"\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":654,"title":655,"description":656,"published":657,"category":428,"image":658,"draft":385},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","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":267,"title":660,"description":661,"published":657,"category":381,"image":662,"draft":385},"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",1790150954115]