[{"data":1,"prerenderedAt":726},["ShallowReactive",2],{"blog-es-stripe-secret-key-in-frontend":3,"blog-index-es":483},{"id":4,"title":5,"body":6,"category":436,"cover":437,"coverAlt":438,"description":439,"draft":440,"extension":441,"faq":442,"image":461,"keywords":462,"meta":470,"navigation":471,"ogTitle":472,"path":473,"published":474,"seo":475,"stem":476,"tldr":477,"updated":474,"__hash__":482},"blog_es\u002Fblog\u002Fstripe-secret-key-in-frontend.md","Una clave secreta de Stripe en tu frontend puede mover dinero",{"type":7,"value":8,"toc":424},"minimark",[9,18,33,42,47,55,58,63,68,71,75,78,182,193,203,207,210,213,219,226,229,232,236,239,273,276,281,284,287,291,294,301,304,307,311,322,331,336,339,355,359,392,395,402],[10,11,12,13,17],"p",{},"Abre tu app en producción en un navegador, mira el código fuente de la página y\nbusca dentro ",[14,15,16],"code",{},"sk_live_",". Si aparece una cadena larga, tienes una clave secreta\nde Stripe expuesta en tu frontend, y cualquier visitante que hayas tenido podría\nhaberla copiado.",[10,19,20,21,25,26,29,30,32],{},"Aquí está la parte que el consejo general sobre claves de API se equivoca:\nStripe te da dos claves activas, se parecen muchísimo, y ",[22,23,24],"strong",{},"una de ellas debe\nestar en tu app."," La clave que empieza por ",[14,27,28],{},"pk_live_"," pertenece ahí. La clave\nque empieza por ",[14,31,16],{}," tiene, en palabras de Stripe, permisos sin\nrestricción sobre todas las APIs. Se diferencian en un carácter en medio de una\ncadena larga, y eso explica la mayor parte de por qué esto sigue pasando.",[10,34,35,36,41],{},"Entre el 12 y el 14 de agosto de 2026 pasamos nueve comprobaciones externas a\n30.998 apps en producción construidas con Lovable, Bolt, v0, Replit y Base44.\nTres de ellas entregaban una clave secreta de Stripe activa, y otras dos una\nrestringida, lo que la convierte en una de las cosas más raras que encontró el\nbarrido; esas mismas nueve comprobaciones encontraron una clave de API de Google\nen 1.142 apps. Las tres claves secretas salieron con nota D, porque un único\nhallazgo crítico tapa la nota ahí por bien que esté todo lo demás. Los números\ncompletos están en\n",[37,38,40],"a",{"href":39},"\u002Fresearch\u002Fvibe-coded-app-security-2026","nuestro informe de escaneo",".",[43,44,46],"h2",{"id":45},"es-un-problema-una-clave-secreta-de-stripe-expuesta-en-tu-frontend","¿Es un problema una clave secreta de Stripe expuesta en tu frontend?",[10,48,49,50,52,53,41],{},"Sí, si la cadena empieza por ",[14,51,16],{},". No, si empieza por ",[14,54,28],{},[10,56,57],{},"Stripe emite dos claves activas porque las dos mitades de un pago ocurren en dos\nsitios distintos. Imagina el mostrador de una tienda. El datáfono mira hacia la\nclientela y está atornillado a la vista de todos, y lo peor que un desconocido\npuede hacer con él es pagarte. La caja registradora detrás del mostrador es otra\ncosa por completo. Se abre, guarda la recaudación del día, y en el cajón de\ndebajo hay una ficha por cada cliente con su dirección escrita.",[10,59,60,62],{},[14,61,28],{}," es el datáfono. Su trabajo es construir un formulario de pago dentro\ndel navegador de otra persona, y la documentación de Stripe dice que las claves\npublicables se pueden exponer sin problema en el código del frontend.",[10,64,65,67],{},[14,66,16],{}," es la llave de la caja. Stripe describe las claves secretas como\nclaves con permisos sin restricción sobre todas las APIs, que es la misma frase\nleída del otro lado: no hay nada en tu cuenta que no alcance.",[10,69,70],{},"Tu app necesita el datáfono en el navegador para poder cobrar siquiera. La llave\nde la caja no debería necesitarla nunca.",[43,72,74],{"id":73},"pk_live_-y-sk_live_-cómo-distinguirlas","pk_live_ y sk_live_: cómo distinguirlas",[10,76,77],{},"Lee el segundo carácter del prefijo. Esa es toda la prueba.",[79,80,81,100],"table",{},[82,83,84],"thead",{},[85,86,87,91,94,97],"tr",{},[88,89,90],"th",{},"Clave",[88,92,93],{},"Empieza por",[88,95,96],{},"¿Segura en el navegador?",[88,98,99],{},"Qué hace",[101,102,103,124,143,160],"tbody",{},[85,104,105,109,114,121],{},[106,107,108],"td",{},"Publicable",[106,110,111],{},[14,112,113],{},"pk_live_…",[106,115,116],{},[117,118,120],"key-verdict",{"type":119},"safe","Su sitio",[106,122,123],{},"Construye el formulario de pago y tokeniza una tarjeta. No lee clientes ni mueve dinero.",[85,125,126,129,134,140],{},[106,127,128],{},"Secreta",[106,130,131],{},[14,132,133],{},"sk_live_…",[106,135,136],{},[117,137,139],{"type":138},"danger","Nunca",[106,141,142],{},"Permisos sin restricción sobre todas las APIs de Stripe, en toda tu cuenta.",[85,144,145,148,153,157],{},[106,146,147],{},"Restringida",[106,149,150],{},[14,151,152],{},"rk_live_…",[106,154,155],{},[117,156,139],{"type":138},[106,158,159],{},"Solo los permisos que marcaste al crearla. Sigue siendo una credencial válida en manos ajenas.",[85,161,162,165,174,179],{},[106,163,164],{},"De prueba",[106,166,167,170,171],{},[14,168,169],{},"sk_test_",", ",[14,172,173],{},"pk_test_",[106,175,176],{},[117,177,178],{"type":138},"No",[106,180,181],{},"Solo toca tu entorno de pruebas. Un problema menor con la misma costumbre detrás.",[10,183,184,185,188,189,192],{},"La parte del medio del prefijo es lo segundo que hay que leer. ",[14,186,187],{},"_test_"," no\nalcanza nada fuera de tu entorno de pruebas, así que una clave de prueba\nfiltrada no te cuesta dinero; aun así publica cómo está construida tu\nintegración, y la guía de Stripe es tratar como comprometida cualquier clave\nsecreta o restringida que aparezca donde no debía. Las cuentas más nuevas pueden\nllevar además una clave de organización que empieza por ",[14,190,191],{},"sk_org_"," y que opera\nsobre más de una cuenta de Stripe a la vez. Sigue la misma regla, y una fuga ahí\nllega más lejos que una sola cuenta.",[194,195,197],"callout",{"type":196},"warn",[10,198,199,202],{},[22,200,201],{},"No se rompe nada cuando pegas la que no era."," Un checkout construido con la\nclave secreta funciona. Los pagos entran, el panel se llena, y la app se\ncomporta exactamente igual que se habría comportado con la clave publicable,\nporque la clave secreta puede hacer todo lo que puede la publicable y bastante\nmás. No hay ningún error del que enterarse ni ninguna advertencia que cerrar, y\npor eso este hallazgo suele tener meses cuando alguien por fin lo lee en un\nescaneo.",[43,204,206],{"id":205},"qué-puede-hacer-alguien-con-una-clave-secreta-de-stripe-filtrada","Qué puede hacer alguien con una clave secreta de Stripe filtrada",[10,208,209],{},"Todo lo que tú puedes hacer en tu propio panel y que no pida tu contraseña.",[10,211,212],{},"No \"obtener acceso no autorizado\". En concreto, sin más que la cadena y una\nterminal: leer tu lista completa de clientes, con nombres, correos, direcciones\nde facturación y los cuatro últimos dígitos de cada tarjeta. Leer todos los\npagos que has cobrado, y por qué pagó cada cliente. Emitir reembolsos. Crear\ncargos y enlaces de pago en tu nombre. Cancelar suscripciones.",[214,215],"diagram",{"alt":216,"caption":217,"src":218},"Una cuadrícula con cuatro filas de iconos a la izquierda: un datáfono, tres personas, dos monedas apiladas y una pila de filas de tabla. Dos columnas llevan los encabezados pk_live_ y sk_live_. En la columna pk_live_ la fila del datáfono tiene una marca verde y las otras tres filas tienen cruces apagadas. En la columna sk_live_ las cuatro filas tienen marcas rojas.","Las dos claves están en el mismo archivo. La segunda columna es lo que compra ese carácter de más, y cada marca roja es una petición que sale bien.","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fwhat-each-key-can-do-1600x820.png",[10,220,221,222,225],{},"Luego está el uso que no tiene nada que ver contigo. Tu cuenta se convierte en\nun sitio donde hacer ",[22,223,224],{},"card testing",", el término del propio Stripe para un\nestafador que pasa números de tarjeta robados por la integración de cualquiera\nhasta dar con los que siguen funcionando. Las tarjetas son de otras personas.\nLos rechazos, los contracargos y las explicaciones son tuyos.",[10,227,228],{},"Lo que en general no pueden hacer es pagarse a sí mismos. Un reembolso vuelve a\nla tarjeta que hizo el pago original, y una transferencia de fondos va a la\ncuenta bancaria registrada, que es la tuya. Suena a buena noticia y no lo es:\nsignifica que el daño llega como dinero tuyo que se va, fichas de tus clientes\ncopiadas y tu cuenta usada para el fraude de otro, en lugar de como una\ntransferencia que pudieras señalar y perseguir.",[10,230,231],{},"Nada de esto exige un atacante sofisticado. La propia documentación de Stripe\ndice que hay actores fraudulentos rastreando sin parar bases de código públicas\nen busca de claves expuestas, y esos rastreadores no necesitan saber quién eres\npara encontrar la tuya.",[43,233,235],{"id":234},"cómo-rotar-una-clave-secreta-de-stripe-sin-cortar-los-cobros","Cómo rotar una clave secreta de Stripe sin cortar los cobros",[10,237,238],{},"Crea primero el repuesto, ponlo en producción y solo entonces caduca la vieja.\nEn ese orden.",[240,241,242,249,255,261,267],"ol",{},[243,244,245,248],"li",{},[22,246,247],{},"En el panel de Stripe, crea una clave secreta nueva."," Deja la vieja en paz por ahora; las dos funcionan a la vez, y ese solape es lo que mantiene tu checkout en marcha.",[243,250,251,254],{},[22,252,253],{},"Pon la clave nueva donde vivía la vieja",", y eso debería ser un servidor, una Edge Function o una ruta serverless. Nunca la app que descarga el navegador.",[243,256,257,260],{},[22,258,259],{},"Despliega y luego cobra un pago real."," Un cobro que sale bien es la única prueba de que la clave nueva está bien conectada.",[243,262,263,266],{},[22,264,265],{},"Caduca la clave vieja."," Stripe lo describe igual: caducar una clave secreta o restringida le impide hacer cualquier otra llamada a la API.",[243,268,269,272],{},[22,270,271],{},"Lee tu historial de pagos"," del periodo en que la clave estuvo expuesta, y tu correo de Stripe por si hay algo que no hiciste tú.",[10,274,275],{},"Si la clave ya está fuera y prefieres perder unos cuantos pagos antes que\ndejarla activa una hora más, hazlo al revés. Rotar una clave la bloquea de\ninmediato y genera una nueva, y Stripe señala que los endpoints de webhook\ncreados con la clave vieja siguen activos, así que tu procesamiento de eventos\nsobrevive a la emergencia.",[214,277],{"alt":278,"caption":279,"src":280},"Tres paneles numerados de izquierda a derecha. En el primero, una ventana de app conecta con una única ficha de clave. En el segundo ha aparecido una segunda ficha de clave, la app conecta ahora con esa, y la primera está dibujada apagada y sin línea. En el tercero la primera ficha está tachada y desaparecida, y la app queda conectada solo a la ficha nueva.","El solape del panel del medio es lo importante. Las dos claves están activas a la vez, y eso es lo que permite el cambio sin un hueco en tu checkout.","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Frolling-the-key-1600x620.png",[10,282,283],{},"Queda un paso más, y es el que casi todo el mundo hace primero: borrar la clave\nde tu código. Hazlo, y ten claro qué consigue. Tus visitantes ya descargaron el\narchivo que la llevaba, ese archivo está en cachés de navegador que no\ncontrolas, y el valor viejo sigue en tu historial de versiones. Caducar la clave\nen Stripe es lo que cierra la puerta. Quitar la línea es lo que te impide\nvolver a enviarla.",[10,285,286],{},"Las claves publicables, por cierto, no se pueden caducar en absoluto. Stripe\nnunca construyó ese control, porque esa clave nunca fue algo que hubiera que\nguardar.",[43,288,290],{"id":289},"qué-es-una-clave-restringida-de-stripe-y-cuándo-es-la-respuesta","Qué es una clave restringida de Stripe y cuándo es la respuesta",[10,292,293],{},"Una clave cortada a medida para un trabajo en lugar de para todos.",[10,295,296,297,300],{},"Una clave restringida empieza por ",[14,298,299],{},"rk_live_"," y lleva únicamente los permisos que\nmarcas al crearla. Una clave que puede leer facturas no puede emitir un\nreembolso. Una clave que puede crear cargos no puede leer tu lista de clientes.\nStripe recomienda pasar de claves secretas a restringidas justo por eso, y es un\nbuen consejo sobre el código que corre en tu servidor.",[10,302,303],{},"No es una forma de hacer aceptable una clave en el navegador. Dos de las 30.998\napps de nuestro barrido entregaban una clave restringida en el frontend, y las\ndos salieron con nota C. Nuestro escaneo trata una clave restringida como\nhallazgo alto donde una secreta es crítico, y un único hallazgo alto tapa la\nnota en C. Quien encuentre esa clave sigue teniendo cada permiso que marcaste,\ndesde donde sea.",[10,305,306],{},"Donde una clave restringida se gana su sitio es en el caso intermedio incómodo,\ny las apps hechas con IA producen unos cuantos. Una herramienta de automatización\nque necesita leer tus transferencias. Un script de informes que alguien te\nescribió en Fiverr. Una Edge Function que solo crea un tipo de cargo. Cada una\ncorre en un servidor y cada una necesita una fracción de tu cuenta, así que cada\nuna lleva su propia clave con esa fracción marcada, y el día que una se filtre\nrevocas una clave en lugar de recablear toda tu integración.",[43,308,310],{"id":309},"cómo-comprobar-qué-está-entregando-tu-app-en-realidad","Cómo comprobar qué está entregando tu app en realidad",[10,312,313,314,316,317,316,319,321],{},"Empieza a mano, porque no cuesta nada y no hace falta instalar nada. Abre tu\nsitio en producción, mira el código fuente de la página y busca dentro\n",[14,315,16],{},", luego ",[14,318,299],{},[14,320,28],{},". Encontrar la tercera y no las\ndos primeras es el resultado que quieres.",[10,323,324,325,327,328,330],{},"Lo que una búsqueda en el código fuente se pierde es el JavaScript que la página\ncarga después, y en una app hecha con Lovable, Bolt o Replit eso es casi todo.\nNuestro escáner gratuito abre tu app en un navegador de verdad, espera a que\nlleguen los bundles y lee esos. Clasifica lo que encuentra en lugar de buscar\ncadenas con forma de clave, así que ",[14,326,28],{}," vuelve marcada como correcta y\n",[14,329,16],{}," vuelve como hallazgo crítico, y las dos nunca acaban en el mismo\nmontón.",[214,332],{"alt":333,"caption":334,"src":335},"La marca de Reeve sobre una cuadrícula de nueve iconos de contorno, uno por comprobación: 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 claves son una de nueve comprobaciones de solo lectura. Las demás son por qué una nota te dice más que una búsqueda en tu propio código fuente.","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fnine-checks-1600x420.png",[10,337,338],{},"La nota, la puntuación y los recuentos aparecen en pantalla en unos 20 segundos,\nsin cuenta. Si das un correo, llega con la lista detallada, junto con una\nsolución escrita para el builder que usaste y que puedes pegar tal cual.",[10,340,341,342,345,346,350,351,41],{},"Tres cosas que el escaneo no hace, y son las razones por las que puedes\napuntarlo sin miedo a una app en producción que cobra de verdad: nunca inicia\nsesión, nunca escribe nada, y nunca se queda con una clave que encuentra. Un\nsecreto expuesto se guarda como una pista enmascarada de la forma\n",[14,343,344],{},"sk_live_…a1b2",", y el valor real se tira.\n",[37,347,349],{"href":348},"\u002F#scan","Escanea tu app",", o lee antes\n",[37,352,354],{"href":353},"\u002Fsecurity-scanner","qué mira cada una de las nueve comprobaciones",[43,356,358],{"id":357},"qué-hacer-ahora-mismo","Qué hacer ahora mismo",[360,361,362],"key-takeaways",{},[363,364,365,377,380,383,386,389],"ul",{},[243,366,367,368,370,371,373,374,376],{},"Lee el segundo carácter antes que nada. ",[14,369,28],{}," en tu bundle está bien y no pide nada; ",[14,372,16],{}," y ",[14,375,299],{}," sí.",[243,378,379],{},"Crea primero la clave de repuesto y confirma un pago real con ella, y solo entonces caduca la vieja en Stripe. Caducarla es lo que cierra la puerta.",[243,381,382],{},"Borrar la clave de tu código no cierra nada por sí solo. El archivo que la llevaba ya está descargado, en caché y en tu historial de versiones.",[243,384,385],{},"Mueve a un servidor lo que necesitara esa clave: una Edge Function, una ruta serverless, cualquier cosa que no sea el navegador.",[243,387,388],{},"Lee tu historial de pagos y tu lista de clientes del periodo en que la clave estuvo activa. Rotar detiene lo que pase a partir de ahora y no dice nada de lo que ya pasó.",[243,390,391],{},"Dale a cada tarea del servidor su propia clave restringida con solo los permisos que necesita, para que la próxima fuga te cueste una clave y no todas.",[10,393,394],{},"Una clave de Stripe suele llegar tarde. La app sale, funciona un tiempo, y un\ndía añades el checkout, y ese es el despliegue que mete por primera vez una\ncredencial de cobro en el bundle. El escaneo que pasaste al lanzar era una foto\nde una app que todavía no podía cobrar.",[10,396,397,401],{},[37,398,400],{"href":399},"\u002Fpricing","Reeve Monitor"," está hecho para ese hueco. Pasa las nueve\ncomprobaciones cada hora sobre hasta tres apps, vigila la disponibilidad cada 60\nsegundos, te avisa el día en que un resultado cambia en lugar de esperar a que\nmires, y manda un informe mensual en lenguaje claro. Una clave que llega al\nbundle con un despliegue de un jueves entra en el escaneo de esa misma hora.\nCuesta $12 al mes de tarifa, con siete días gratis antes de cobrarte, y la\npágina de precios a veces está por debajo de la cifra de aquí y nunca por\nencima.",[10,403,404,405,409,410,414,415,419,420,41],{},"Si lo prefieres como lista, la\n",[37,406,408],{"href":407},"\u002Fchecklist","checklist de seguridad de 10 minutos"," cubre esto junto con las\notras cosas que conviene cerrar en una app recién lanzada. Para la pregunta más\namplia de qué claves pintan algo en un navegador, tenemos\n",[37,411,413],{"href":412},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","una guía para distinguir claves publicables de secretas",",\n",[37,416,418],{"href":417},"\u002Fblog\u002Fopenai-api-key-exposed-in-frontend","la misma pregunta para una clave de OpenAI",",\ny ",[37,421,423],{"href":422},"\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","un censo de lo que 30.998 apps entregaban de verdad",{"title":425,"searchDepth":426,"depth":426,"links":427},"",3,[428,430,431,432,433,434,435],{"id":45,"depth":429,"text":46},2,{"id":73,"depth":429,"text":74},{"id":205,"depth":429,"text":206},{"id":234,"depth":429,"text":235},{"id":289,"depth":429,"text":290},{"id":309,"depth":429,"text":310},{"id":357,"depth":429,"text":358},"Fundamentos de seguridad","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcover-1200x630.png","Una caja registradora de tienda con el cajón del dinero abierto y una llave olvidada en la cerradura del frente de la máquina.","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í.",false,"md",[443,446,449,452,455,458],{"q":444,"a":445},"¿Es segura mi clave publicable de Stripe en el frontend?","Sí. Una clave que empieza por pk_live_ debe estar en la página, y Stripe lo dice en su propia documentación: las claves publicables se pueden exponer sin problema en el código del frontend. Construye el formulario de pago y tokeniza una tarjeta. No puede leer tus clientes, ni mover dinero, ni reembolsar nada. Si un escáner o un conocido te dijo que tienes una clave de Stripe expuesta, lee el segundo carácter antes de hacer cualquier otra cosa, porque una clave pk_live_ dentro de tu bundle es tu integración funcionando tal como Stripe la diseñó.",{"q":447,"a":448},"¿Qué puede hacer alguien con una clave secreta de Stripe filtrada?","Todo lo que tú puedes hacer en tu propio panel y que no pida tu contraseña. Puede leer tu lista completa de clientes con nombres, correos, direcciones de facturación y los cuatro últimos dígitos de cada tarjeta, leer todos los pagos que has cobrado, emitir reembolsos hasta vaciar tu saldo, crear cargos y enlaces de pago, y pasar números de tarjeta robados por tu cuenta para encontrar los que siguen funcionando. A esto último Stripe lo llama card testing, y a ti te llega como contracargos y rechazos en una cuenta que creías tranquila.",{"q":450,"a":451},"¿Cómo roto una clave de Stripe sin cortar los cobros?","Crea primero el repuesto. En el panel de Stripe crea una clave secreta nueva, ponla donde vivía la vieja en tu servidor, despliega y confirma un pago real con la clave nueva. Solo entonces caduca la vieja, lo que le impide hacer cualquier otra llamada a la API. Si la clave ya es pública y prefieres perder unos cuantos pagos antes que dejarla activa, rótala de golpe: rotar bloquea la clave de inmediato y genera una nueva, y Stripe señala que los endpoints de webhook creados con la clave vieja siguen activos.",{"q":453,"a":454},"¿Qué es una clave restringida de Stripe?","Una clave cortada a medida para un solo trabajo. Una clave restringida empieza por rk_live_ y lleva únicamente los permisos que marcas al crearla, de modo que una clave que puede leer facturas no puede emitir un reembolso. Stripe recomienda pasar de claves secretas a restringidas justo por eso. Léelo como un consejo sobre el código de tu servidor, no como una forma de hacer aceptable una clave en el navegador: una clave restringida dentro de tu bundle sigue siendo una credencial que un desconocido puede usar, y nuestro escaneo la califica como hallazgo alto.",{"q":456,"a":457},"¿Stripe me avisa si mi clave se filtra?","A veces, y no puedes contar con ello. Stripe dice que rastrea internet de forma activa en busca de claves de API filtradas, con herramientas como el escáner de tokens de GitHub, y que puede avisarte o desactivar una clave que encuentre. Su propia página de buenas prácticas añade que la detección no está garantizada. Ese rastreo funciona mejor sobre repositorios de código públicos, y una clave compilada dentro del JavaScript de tu propio dominio no es un repositorio. Trata como comprometida cualquier clave que hayas visto donde no debía estar, diga Stripe algo o no.",{"q":459,"a":460},"¿Una clave de prueba (sk_test_) es peligrosa en mi frontend?","Es un problema bastante menor que una clave activa y aun así conviene cerrarlo. Una clave de prueba solo toca tu entorno de pruebas, así que nadie puede llevarse tu dinero con ella. Lo que sí entrega es un mapa práctico de cómo está montada tu integración, y suele significar que la misma costumbre de copiar y pegar está a un despliegue de mandar la clave activa. Stripe trata como comprometida cualquier clave secreta o restringida que aparezca donde no debía. Caducala y mueve la llamada a un servidor.","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcard-800x500.png",[463,464,465,466,467,468,469],"clave secreta de stripe expuesta","clave sk_live en el frontend","clave de stripe filtrada qué hacer","clave restringida de stripe","es segura mi clave publicable de stripe","rotar clave de api de stripe","clave de stripe en el bundle de javascript",{},true,"¿Clave secreta de Stripe expuesta en tu frontend?","\u002Fblog\u002Fstripe-secret-key-in-frontend","2026-09-19",{"title":5,"description":439},"blog\u002Fstripe-secret-key-in-frontend",[478,479,480,481],"Una clave secreta de Stripe expuesta en tu frontend es la fuga que se cobra a tu cuenta: reembolsos, cargos nuevos y cada ficha de cliente que tienes.","pk_live_ pertenece a tu app y siempre fue así. sk_live_ se diferencia en un solo carácter y tiene permisos sin restricción sobre toda tu cuenta de Stripe.","Crea primero la clave de repuesto, ponla en producción y solo entonces caduca la vieja. Borrar la línea de tu código no recupera nada que alguien ya descargó.","Encontramos una clave secreta de Stripe activa en 3 de 30.998 apps escaneadas. Las tres salieron con nota D.","E8sbeuLxU9ZuluzlIkJTckoCtmcb3RnFOEQTCKiwVpI",[484,491,497,503,509,510,516,522,528,534,540,546,552,558,564,570,576,582,588,594,600,605,610,616,622,628,634,640,646,652,658,664,670,676,682,688,693,699,705,711,716,722],{"path":485,"title":486,"description":487,"published":488,"category":489,"image":490,"draft":440},"\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":492,"title":493,"description":494,"published":495,"category":436,"image":496,"draft":440},"\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":498,"title":499,"description":500,"published":501,"category":436,"image":502,"draft":440},"\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":504,"title":505,"description":506,"published":507,"category":436,"image":508,"draft":440},"\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":473,"title":5,"description":439,"published":474,"category":436,"image":461,"draft":440},{"path":511,"title":512,"description":513,"published":514,"category":436,"image":515,"draft":440},"\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":517,"title":518,"description":519,"published":520,"category":436,"image":521,"draft":440},"\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":523,"title":524,"description":525,"published":526,"category":436,"image":527,"draft":440},"\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":529,"title":530,"description":531,"published":532,"category":436,"image":533,"draft":440},"\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":535,"title":536,"description":537,"published":538,"category":489,"image":539,"draft":440},"\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":541,"title":542,"description":543,"published":544,"category":489,"image":545,"draft":440},"\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":547,"title":548,"description":549,"published":550,"category":489,"image":551,"draft":440},"\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":553,"title":554,"description":555,"published":556,"category":436,"image":557,"draft":440},"\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":559,"title":560,"description":561,"published":562,"category":436,"image":563,"draft":440},"\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":565,"title":566,"description":567,"published":568,"category":436,"image":569,"draft":440},"\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":571,"title":572,"description":573,"published":574,"category":436,"image":575,"draft":440},"\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":577,"title":578,"description":579,"published":580,"category":436,"image":581,"draft":440},"\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":583,"title":584,"description":585,"published":586,"category":436,"image":587,"draft":440},"\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":589,"title":590,"description":591,"published":592,"category":436,"image":593,"draft":440},"\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":595,"title":596,"description":597,"published":598,"category":436,"image":599,"draft":440},"\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":417,"title":601,"description":602,"published":603,"category":436,"image":604,"draft":440},"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":422,"title":606,"description":607,"published":608,"category":436,"image":609,"draft":440},"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":611,"title":612,"description":613,"published":614,"category":489,"image":615,"draft":440},"\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":617,"title":618,"description":619,"published":620,"category":436,"image":621,"draft":440},"\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":623,"title":624,"description":625,"published":626,"category":489,"image":627,"draft":440},"\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":629,"title":630,"description":631,"published":632,"category":436,"image":633,"draft":440},"\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":635,"title":636,"description":637,"published":638,"category":436,"image":639,"draft":440},"\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":641,"title":642,"description":643,"published":644,"category":436,"image":645,"draft":440},"\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":647,"title":648,"description":649,"published":650,"category":436,"image":651,"draft":440},"\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":653,"title":654,"description":655,"published":656,"category":489,"image":657,"draft":440},"\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":659,"title":660,"description":661,"published":662,"category":489,"image":663,"draft":440},"\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":665,"title":666,"description":667,"published":668,"category":436,"image":669,"draft":440},"\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":671,"title":672,"description":673,"published":674,"category":436,"image":675,"draft":440},"\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":677,"title":678,"description":679,"published":680,"category":489,"image":681,"draft":440},"\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":683,"title":684,"description":685,"published":686,"category":436,"image":687,"draft":440},"\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":689,"title":690,"description":691,"published":686,"category":436,"image":692,"draft":440},"\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":694,"title":695,"description":696,"published":697,"category":436,"image":698,"draft":440},"\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":700,"title":701,"description":702,"published":703,"category":489,"image":704,"draft":440},"\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":706,"title":707,"description":708,"published":709,"category":436,"image":710,"draft":440},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","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":712,"title":713,"description":714,"published":709,"category":489,"image":715,"draft":440},"\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":717,"title":718,"description":719,"published":720,"category":489,"image":721,"draft":440},"\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":412,"title":723,"description":724,"published":720,"category":436,"image":725,"draft":440},"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",1790150954056]