{"id":54019,"date":"2026-06-24T14:27:18","date_gmt":"2026-06-24T07:27:18","guid":{"rendered":"\/es\/tutoriales\/?p=54019"},"modified":"2026-06-24T14:34:17","modified_gmt":"2026-06-24T07:34:17","slug":"seguridad-en-vibe-coding","status":"publish","type":"post","link":"\/es\/tutoriales\/seguridad-en-vibe-coding","title":{"rendered":"\u00bfQu\u00e9 es la seguridad en el vibe coding? Riesgos y buenas pr\u00e1cticas"},"content":{"rendered":"<p>La seguridad en el vibe coding consiste en mantener seguras las aplicaciones generadas con IA mediante la revisi&oacute;n del c&oacute;digo, las dependencias, los controles de acceso y los procesos de desarrollo.<\/p><p>El vibe coding consiste en generar c&oacute;digo con IA mediante prompts en lenguaje natural en lugar de escribirlo todo manualmente. Esto acelera el desarrollo, pero tambi&eacute;n implica riesgos.<\/p><p>La IA puede crear funciones que parecen funcionar bien a simple vista, pero que aun as&iacute; incluyen configuraciones predeterminadas inseguras, secretos expuestos, autenticaci&oacute;n d&eacute;bil o dependencias vulnerables.<\/p><p>Desarrollar aplicaciones m&aacute;s seguras impulsadas por IA depende de detectar esas carencias a tiempo. Eso significa aplicar controles de seguridad desde el principio, comprobar lo que el c&oacute;digo hace realmente y usar las herramientas adecuadas para detectar problemas antes de que lleguen a producci&oacute;n.<\/p><h2 class=\"wp-block-heading\" id=\"h-como-genera-riesgos-de-seguridad-el-vibe-coding\">&iquest;C&oacute;mo genera riesgos de seguridad el vibe coding?<\/h2><p>El vibe coding conlleva riesgos de seguridad porque la IA genera c&oacute;digo sin validarlo desde el punto de vista de la seguridad.<\/p><p>Los modelos de lenguaje grandes (LLM) no entienden la seguridad como lo hace una persona desarrolladora o especialista en seguridad.<\/p><p>Estos modelos predicen el patr&oacute;n m&aacute;s probable siguiente a partir de los datos de entrenamiento. Eso les ayuda a generar c&oacute;digo r&aacute;pidamente, pero no les ayuda a evaluar si el c&oacute;digo es seguro. Un modelo puede generar algo que parece limpio y funciona en una demo, pero aun as&iacute; no supera ni siquiera los controles de seguridad b&aacute;sicos.<\/p><p><strong>El primer problema es que los LLM predicen patrones, no una l&oacute;gica segura. <\/strong>Copian patrones de c&oacute;digo habituales a partir de ejemplos que han visto y muchos de esos ejemplos est&aacute;n incompletos, desactualizados o no son seguros. <\/p><p>Un flujo de inicio de sesi&oacute;n, un formulario de pago, una funci&oacute;n para subir archivos o un endpoint de una API pueden parecer correctos a simple vista, pero aun as&iacute; pasar por alto las comprobaciones que protegen a las personas usuarias y a los datos reales.<\/p><p><strong>El segundo problema es la falta de comprensi&oacute;n del contexto. <\/strong>La seguridad del c&oacute;digo depende de todo el sistema que lo rodea: c&oacute;mo inician sesi&oacute;n las personas usuarias, a qu&eacute; datos pueden acceder, d&oacute;nde se almacenan los secretos, qu&eacute; roles existen y qu&eacute; debe ocurrir cuando algo falla. <\/p><p>Un modelo de IA normalmente solo ve el prompt y la peque&ntilde;a porci&oacute;n de c&oacute;digo que le has dado. No entiende de forma fiable toda tu aplicaci&oacute;n, tu modelo de amenazas ni tus requisitos de cumplimiento.<\/p><p>Como resultado, puede a&ntilde;adir c&oacute;digo que entre en conflicto con el resto del sistema o crear una brecha entre componentes que por s&iacute; solos parec&iacute;an seguros.<\/p><p><strong>El tercer problema es que no hay comprobaciones de seguridad integradas durante la generaci&oacute;n. <\/strong>Un modelo puede generar c&oacute;digo, pero generarlo no es lo mismo que revisarlo, probarlo o validarlo. <\/p><p>Desarrollar software seguro requiere pasos adicionales, como validar las entradas, controlar el acceso, gestionar los secretos, limitar la tasa de solicitudes, registrar la actividad, revisar las dependencias y hacer pruebas de abuso. La IA no a&ntilde;ade esas protecciones de forma predeterminada solo porque haya escrito el c&oacute;digo.<\/p><p>El <a href=\"\/es\/tutoriales\/que-es-vibe-coding\">vibe coding<\/a> fomenta un desarrollo r&aacute;pido, y el desarrollo r&aacute;pido suele pasar por alto la revisi&oacute;n. Cuando una funci&oacute;n parece funcionar de inmediato, es m&aacute;s probable que los equipos la publiquen sin revisar bien el c&oacute;digo, sin hacer una revisi&oacute;n de seguridad o sin probarla adecuadamente.<\/p><p>Eso crea un patr&oacute;n peligroso: cuanto m&aacute;s r&aacute;pido llega el c&oacute;digo, m&aacute;s f&aacute;cil es confiar en &eacute;l antes de que alguien compruebe si es seguro.<\/p><p>Veamos un ejemplo. Le pides a la IA: &ldquo;Crea un sistema de inicio de sesi&oacute;n.&rdquo; Crea un formulario, comprueba el nombre de usuario y la contrase&ntilde;a y devuelve un token de sesi&oacute;n.<\/p><p>A primera vista, parece terminado. Pero el c&oacute;digo podr&iacute;a almacenar las contrase&ntilde;as de forma incorrecta, omitir la autenticaci&oacute;n multifactor, no bloquear las cuentas tras varios intentos o permitir que se mantengan tokens de sesi&oacute;n d&eacute;biles durante demasiado tiempo. <\/p><p>El sistema de inicio de sesi&oacute;n funciona, pero la autenticaci&oacute;n no es lo bastante s&oacute;lida como para proteger cuentas reales.<\/p><p>Ese es el riesgo principal del vibe coding: elimina la fricci&oacute;n al escribir c&oacute;digo, pero tambi&eacute;n elimina las pausas en las que normalmente se detectan los errores de seguridad.<\/p><h2 class=\"wp-block-heading\" id=\"h-cuales-son-los-principales-riesgos-de-seguridad-del-vibe-coding\">&iquest;Cu&aacute;les son los principales riesgos de seguridad del vibe coding?<\/h2><p>Los principales riesgos son generar c&oacute;digo inseguro, usar secretos integrados en el c&oacute;digo, depender de componentes con vulnerabilidades, no contar con autenticaci&oacute;n ni autorizaci&oacute;n, conceder permisos excesivos y tener una falsa sensaci&oacute;n de seguridad.<\/p><p>Cada uno de estos factores debilita una parte distinta del sistema, desde c&oacute;mo se escribe el c&oacute;digo hasta c&oacute;mo se controla el acceso y cu&aacute;nta confianza depositan los equipos de desarrollo en los resultados generados por la IA.<\/p><p>Esto no es un problema te&oacute;rico. En el <a href=\"https:\/\/www.veracode.com\/wp-content\/uploads\/October-2025-GenAI-Code-Security-Report-Update.pdf\" data-wpel-link=\"external\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">informe de Veracode de 2025 sobre la seguridad del c&oacute;digo GenAI<\/a>, solo el 55% del c&oacute;digo generado era seguro, lo que significa que el <strong>45% conten&iacute;a una vulnerabilidad de seguridad conocida<\/strong>.<\/p><h3 class=\"wp-block-heading\">1. Generaci&oacute;n de c&oacute;digo inseguro<\/h3><p>La IA puede generar c&oacute;digo que funcione, pero aun as&iacute; dejar lagunas de seguridad evidentes. El problema no es que la funci&oacute;n falle. El problema es que funciona sin las comprobaciones que impiden el acceso a atacantes.<\/p><p>Una de las comprobaciones que m&aacute;s suelen faltar es validar correctamente las entradas de usuario. Cuando la entrada de usuario no se valida ni se sanitiza, se abren v&iacute;as directas para los ataques.<\/p><p>Un problema com&uacute;n es la <strong>inyecci&oacute;n SQL<\/strong>. Esto ocurre cuando una aplicaci&oacute;n crea una consulta a la base de datos directamente a partir de la entrada del usuario. Si no se gestiona la entrada de forma segura, una persona atacante puede modificar la consulta y extraer datos que nunca deber&iacute;a ver.<\/p><p>Por ejemplo, un formulario de inicio de sesi&oacute;n puede pedir un nombre de usuario y una contrase&ntilde;a, pero un c&oacute;digo inseguro podr&iacute;a permitir que alguien escriba una entrada manipulada que convierta la consulta en &ldquo;mu&eacute;strame todos los usuarios&rdquo; en lugar de &ldquo;comprueba esta cuenta&rdquo;.<\/p><p>Otro riesgo de seguridad es el <strong>cross-site scripting (XSS)<\/strong>. Aparece cuando una aplicaci&oacute;n muestra la entrada del usuario sin limpiarla antes.<\/p><p>La IA suele generar funcionalidades de front-end como secciones de comentarios, formularios o perfiles de usuario sin sanitizar correctamente los datos de salida. El c&oacute;digo funciona y muestra el contenido correctamente, pero no comprueba si es seguro mostrar ese contenido.<\/p><p>Una persona atacante puede enviar JavaScript malicioso y la web muestra despu&eacute;s ese script a otras personas usuarias como si fuera contenido normal.<\/p><p>En la pr&aacute;ctica, alguien podr&iacute;a usar un cuadro de comentarios para publicar c&oacute;digo malicioso oculto. Cuando otra persona abre la p&aacute;gina, ese c&oacute;digo se ejecuta en su navegador y puede robar su sesi&oacute;n de inicio de sesi&oacute;n, lo que permite que quien ataque acceda a su cuenta.<\/p><div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" width=\"831\" height=\"458\" src=\"https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/32\/2026\/06\/Diagrama-de-inyeccion-SQL.png\/public\" alt=\"Diagrama que muestra c&oacute;mo una entrada de inicio de sesi&oacute;n no segura &quot;admin'--&quot; provoca resultados inesperados en la consulta y revela varias cuentas de usuario y emails.\" class=\"wp-image-54261\" srcset=\"https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/32\/2026\/06\/Diagrama-de-inyeccion-SQL.png\/w=831,fit=scale-down 831w, https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/32\/2026\/06\/Diagrama-de-inyeccion-SQL.png\/w=300,fit=scale-down 300w, https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/32\/2026\/06\/Diagrama-de-inyeccion-SQL.png\/w=150,fit=scale-down 150w, https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/32\/2026\/06\/Diagrama-de-inyeccion-SQL.png\/w=768,fit=scale-down 768w\" sizes=\"(max-width: 831px) 100vw, 831px\" \/><\/figure>\n<\/div><p>Un tercer problema es la <strong>Insecure Direct Object Reference (IDOR)<\/strong>, o referencia directa insegura a objetos. Ocurre cuando una aplicaci&oacute;n usa ID en las URL, pero no comprueba si la persona usuaria puede acceder a esos datos concretos.<\/p><p>Por ejemplo, una persona usuaria podr&iacute;a abrir una p&aacute;gina como <strong>\/invoice\/123<\/strong> para ver su factura. Si la aplicaci&oacute;n solo comprueba que la persona usuaria ha iniciado sesi&oacute;n, pero no si esa factura le pertenece, esta puede cambiar el n&uacute;mero en la URL a <strong>\/invoice\/124<\/strong> y ver la factura, el perfil o los detalles del pedido de otra persona.<\/p><p>Esto es com&uacute;n en el vibe coding porque la IA suele generar p&aacute;ginas y rutas que funcionan, pero omite las comprobaciones de propiedad que hay detr&aacute;s. La funci&oacute;n funciona, pero no controla qui&eacute;n debe tener acceso.<\/p><h3 class=\"wp-block-heading\">2. Secretos incrustados en el c&oacute;digo generado por IA<\/h3><p>La IA puede introducir datos sensibles directamente en el c&oacute;digo en lugar de almacenarlos de forma segura.<\/p><p>Los secretos incluyen claves de API, contrase&ntilde;as de bases de datos, tokens de acceso y credenciales privadas. No deben escribirse nunca dentro de los archivos fuente. Deben guardarse en un almacenamiento seguro, como variables de entorno o gestores de secretos, donde se pueda controlar y supervisar el acceso.<\/p><p>Le pides a la IA que genere c&oacute;digo para conectarse a una API de pagos. Devuelve un fragmento de c&oacute;digo funcional con una clave de API escrita directamente en el archivo:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">API_KEY = \"sk-123456789abcdef\"<\/pre><p>Esa clave parece real y el c&oacute;digo funciona. Pero <strong>nunca debe escribirse directamente en el archivo de esa manera<\/strong>.<\/p><p>El verdadero peligro es la exposici&oacute;n. Una vez que un secreto entra en el c&oacute;digo, se propaga r&aacute;pidamente. Puede acabar en el control de versiones, repositorios compartidos, registros, copias de seguridad o incluso capturas de pantalla. A partir de ese momento, cualquiera que lo encuentre puede usarlo.<\/p><p>Ese acceso es inmediato. Una clave de API expuesta permite que alguien use tu cuenta, env&iacute;e solicitudes y genere costes como si fuera tu aplicaci&oacute;n.<\/p><p>Una contrase&ntilde;a filtrada de la base de datos puede dar acceso total a los datos almacenados. Eso significa que alguien puede leer, copiar o eliminar toda tu base de datos.<\/p><p>Incluso un descuido breve, como subir c&oacute;digo a un repositorio p&uacute;blico durante unos minutos, basta para que bots automatizados detecten y capturen esos secretos. Una vez que eso ocurre, los atacantes pueden acceder a tu sistema casi de inmediato, a menudo antes de que siquiera notes la exposici&oacute;n.<\/p><h3 class=\"wp-block-heading\">3. Dependencias vulnerables o desactualizadas<\/h3><p>Las dependencias vulnerables o desactualizadas generan riesgos porque la IA puede sugerir paquetes inseguros, obsoletos o inexistentes.<\/p><p>Las aplicaciones modernas dependen de bibliotecas de terceros para tareas como los pagos, la autenticaci&oacute;n y la gesti&oacute;n de archivos. Eso te ahorra tiempo, pero tambi&eacute;n significa que est&aacute;s confiando en c&oacute;digo escrito por otra persona. <\/p><p>Si esa biblioteca tiene una vulnerabilidad conocida, tu aplicaci&oacute;n la hereda. Eso significa que los atacantes pueden aprovechar esa vulnerabilidad para acceder a datos, hacer que las funciones dejen de funcionar o ejecutar acciones maliciosas dentro de tu sistema.<\/p><div class=\"wp-block-image\">\n<figure data-wp-context='{\"imageId\":\"6a3be003d5601\"}' data-wp-interactive=\"core\/image\" data-wp-key=\"6a3be003d5601\" class=\"aligncenter size-full wp-lightbox-container\"><img decoding=\"async\" width=\"808\" height=\"455\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/32\/2026\/06\/diagrama-de-riesgo-de-dependencia.png\/public\" alt=\"Diagrama que muestra una aplicaci&oacute;n con bibliotecas de terceros y destaca una vulnerabilidad en el manejo de archivos que provoca un riesgo heredado y un riesgo de impacto en el sistema.\" class=\"wp-image-54262\" srcset=\"https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/32\/2026\/06\/diagrama-de-riesgo-de-dependencia.png\/w=808,fit=scale-down 808w, https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/32\/2026\/06\/diagrama-de-riesgo-de-dependencia.png\/w=300,fit=scale-down 300w, https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/32\/2026\/06\/diagrama-de-riesgo-de-dependencia.png\/w=150,fit=scale-down 150w, https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/32\/2026\/06\/diagrama-de-riesgo-de-dependencia.png\/w=768,fit=scale-down 768w\" sizes=\"(max-width: 808px) 100vw, 808px\" \/><button class=\"lightbox-trigger\" type=\"button\" aria-haspopup=\"dialog\" aria-label=\"Enlarge\" data-wp-init=\"callbacks.initTriggerButton\" data-wp-on--click=\"actions.showLightbox\" data-wp-style--right=\"state.imageButtonRight\" data-wp-style--top=\"state.imageButtonTop\">\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewbox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\"><\/path>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n<\/div><p>Esto se vuelve m&aacute;s peligroso en el vibe coding porque la IA sugiere lo que es probable, no lo que es seguro. Puede recomendar bibliotecas obsoletas con problemas conocidos o incluso generar nombres de paquetes que no existen.<\/p><p>Eso crea un riesgo de cadena de suministro. Puede que tu propio c&oacute;digo est&eacute; bien, pero el paquete que instalas aun as&iacute; puede dejar tu sistema expuesto. Una dependencia vulnerable puede darles a los atacantes una v&iacute;a de entrada a trav&eacute;s de sus propios fallos.<\/p><p>Una biblioteca falsa puede ir m&aacute;s all&aacute; y robar informaci&oacute;n confidencial, modificar archivos o ejecutar c&oacute;digo malicioso durante la instalaci&oacute;n.<\/p><p>Por ejemplo, le pides a la IA un paquete para gestionar la carga de archivos. Parece una biblioteca leg&iacute;tima, as&iacute; que la instalas sin comprobarlo.<\/p><p>La funci&oacute;n funciona, as&iacute; que pasas a lo siguiente. Pero el paquete est&aacute; desactualizado y tiene una vulnerabilidad conocida, o es un paquete malicioso con un nombre parecido. Ahora los atacantes pueden aprovechar esa dependencia para acceder a tu sistema o a tus datos.<\/p><h3 class=\"wp-block-heading\">4. Falta de autenticaci&oacute;n y autorizaci&oacute;n<\/h3><p>La falta de autenticaci&oacute;n y autorizaci&oacute;n supone un riesgo grave porque el sistema no comprueba correctamente qui&eacute;n es una persona usuaria ni qu&eacute; puede hacer.<\/p><p>La autenticaci&oacute;n y la autorizaci&oacute;n resuelven dos problemas diferentes. La autenticaci&oacute;n confirma la identidad, lo que significa que la persona usuaria es quien dice ser. La autorizaci&oacute;n controla el acceso, es decir, lo que esa persona puede ver o modificar. Si falta cualquiera de estos pasos, el sistema expone datos o acciones a las personas equivocadas.<\/p><p>Un fallo habitual consiste en dejar <strong>endpoints abiertos<\/strong>. Un endpoint es simplemente una URL que muestra datos o realiza una acci&oacute;n. Si esa URL no requiere iniciar sesi&oacute;n, cualquiera puede acceder a ella.<\/p><p>Por ejemplo, imagina una p&aacute;gina como <strong>\/users<\/strong> que muestra una lista de clientes. Si no hay ninguna comprobaci&oacute;n de inicio de sesi&oacute;n, cualquiera que encuentre ese enlace puede abrirlo. Eso significa que los datos privados de las personas usuarias quedan visibles para el p&uacute;blico, aunque deb&iacute;an mantenerse internos.<\/p><div class=\"wp-block-image\">\n<figure data-wp-context='{\"imageId\":\"6a3be003d6b7b\"}' data-wp-interactive=\"core\/image\" data-wp-key=\"6a3be003d6b7b\" class=\"aligncenter size-full wp-lightbox-container\"><img decoding=\"async\" width=\"823\" height=\"461\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/32\/2026\/06\/Diagrama-de-autenticacion-y-acceso-publico.png\/public\" alt=\"Comparaci&oacute;n en paralelo: una ventana del navegador muestra un formulario de inicio de sesi&oacute;n que restringe el acceso y la otra muestra una lista de usuarios con emails visibles, lo que indica que hay datos internos expuestos y que no se comprueba el inicio de sesi&oacute;n.\" class=\"wp-image-54263\" srcset=\"https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/32\/2026\/06\/Diagrama-de-autenticacion-y-acceso-publico.png\/w=823,fit=scale-down 823w, https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/32\/2026\/06\/Diagrama-de-autenticacion-y-acceso-publico.png\/w=300,fit=scale-down 300w, https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/32\/2026\/06\/Diagrama-de-autenticacion-y-acceso-publico.png\/w=150,fit=scale-down 150w, https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/32\/2026\/06\/Diagrama-de-autenticacion-y-acceso-publico.png\/w=768,fit=scale-down 768w\" sizes=\"(max-width: 823px) 100vw, 823px\" \/><button class=\"lightbox-trigger\" type=\"button\" aria-haspopup=\"dialog\" aria-label=\"Enlarge\" data-wp-init=\"callbacks.initTriggerButton\" data-wp-on--click=\"actions.showLightbox\" data-wp-style--right=\"state.imageButtonRight\" data-wp-style--top=\"state.imageButtonTop\">\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewbox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\"><\/path>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n<\/div><p>Otro problema com&uacute;n es que <strong>las comprobaciones de seguridad se aplican en algunos casos, pero faltan en otros<\/strong>.<\/p><p>Por ejemplo, tu panel de control puede requerir que las personas usuarias inicien sesi&oacute;n. Esa parte funciona correctamente. Pero, entre bastidores, la aplicaci&oacute;n tambi&eacute;n puede tener una ruta de API como <strong>\/api\/export-data<\/strong> que devuelve los mismos datos.<\/p><p>Si esa ruta de la API no comprueba si has iniciado sesi&oacute;n, cualquiera podr&aacute; acceder a ella directamente al visitar la URL o enviar una solicitud. As&iacute; que, aunque la interfaz parezca segura, los datos siguen expuestos.<\/p><p>Otro problema es <strong>confiar en que la interfaz aplique los permisos<\/strong>.<\/p><p>Por ejemplo, podr&iacute;as ocultar un bot&oacute;n de &ldquo;Eliminar cuenta&rdquo; para los usuarios habituales. Eso hace que parezca que no pueden eliminar cuentas.<\/p><p>Pero si el backend no verifica los permisos, t&uacute; a&uacute;n puedes enviar una solicitud manualmente con las herramientas de desarrollador del navegador o una herramienta de API y activar la misma acci&oacute;n.<\/p><p>En otras palabras, ocultar algo en la interfaz de usuario no lo protege. El servidor debe aplicar la regla.<\/p><p>Esto es habitual en el vibe coding porque la IA suele generar interfaces y rutas funcionales sin aplicar comprobaciones coherentes en todo el backend. La funci&oacute;n funciona como se espera en la interfaz de usuario, pero el sistema no controla por completo qui&eacute;n puede acceder a esas acciones o activarlas.<\/p><h3 class=\"wp-block-heading\">5. Permisos excesivos en los agentes de IA<\/h3><p>Los permisos excesivos generan riesgos porque a los agentes de IA se les concede acceso a m&aacute;s recursos de tu sistema de los que realmente necesitan.<\/p><p>Los agentes de IA suelen conectarse a sistemas reales, como archivos, bases de datos o servicios en la nube. Si el acceso es demasiado amplio, pueden ir mucho m&aacute;s all&aacute; de la tarea que deben realizar. <\/p><p>Un agente pensado para leer tickets de soporte tambi&eacute;n podr&iacute;a editar datos de usuarios. Un agente dise&ntilde;ado para resumir logs tambi&eacute;n podr&iacute;a tener permiso para eliminar archivos o cambiar la configuraci&oacute;n.<\/p><p>En la pr&aacute;ctica, esto significa que un solo error puede convertirse en un incidente grave. El agente podr&iacute;a exponer datos sensibles, sobrescribir archivos importantes o provocar cambios en sistemas de producci&oacute;n sin que nadie lo notara de inmediato.<\/p><p>Imagina un agente de IA que te ayuda a organizar archivos en una unidad compartida de la empresa. Solo necesita acceso a una carpeta. En cambio, se le da acceso a toda la unidad. La tarea funciona, pero ahora un prompt deficiente o un peque&ntilde;o error puede mover, eliminar o dejar expuestos archivos de finanzas, del &aacute;rea legal o de recursos humanos.<\/p><h3 class=\"wp-block-heading\">6. Falsa sensaci&oacute;n de seguridad en los resultados de la IA<\/h3><p>Una falsa sensaci&oacute;n de seguridad es un riesgo importante en el vibe coding, ya que el c&oacute;digo generado por IA puede parecer completo aunque no se haya revisado adecuadamente.<\/p><p>El c&oacute;digo funciona, la p&aacute;gina carga y parece que la funci&oacute;n funciona. Eso genera confianza demasiado pronto. Parece terminado, as&iacute; que se env&iacute;a sin una revisi&oacute;n m&aacute;s a fondo. Pero que el c&oacute;digo funcione no significa que sea seguro.<\/p><p>En la pr&aacute;ctica, esto significa que se pasan por alto comprobaciones importantes. No se valida la entrada. No se aplican los permisos. Las acciones sensibles no est&aacute;n protegidas.<\/p><p>Por ejemplo, le pides a la IA que cree una funci&oacute;n de &ldquo;olvid&eacute; mi contrase&ntilde;a&rdquo;. Crea un formulario en el que las personas usuarias introducen su email y les env&iacute;a un enlace para restablecer la contrase&ntilde;a.<\/p><p>El enlace funciona. Haces clic en &eacute;l, estableces una contrase&ntilde;a nueva y todo parece correcto.<\/p><p>Pero el enlace no caduca y no est&aacute; vinculado a la persona usuaria correcta. Si alguien consigue acceder a ese enlace, podr&aacute; restablecer la contrase&ntilde;a y hacerse con el control de la cuenta.<\/p><h2 class=\"wp-block-heading\" id=\"h-por-que-los-procesos-de-seguridad-tradicionales-fallan-en-el-vibe-coding\">&iquest;Por qu&eacute; los procesos de seguridad tradicionales fallan en el vibe coding?<\/h2><p>Cuando comparas el vibe coding con la programaci&oacute;n tradicional, la diferencia clave est&aacute; en la rapidez con la que el c&oacute;digo pasa de la idea a producci&oacute;n, a menudo sin pasar por las etapas de revisi&oacute;n en las que se detectan los problemas de seguridad.<\/p><p>Por ejemplo, imagina que creas una funci&oacute;n para subir archivos que permita a las personas usuarias subir fotos de perfil. La funci&oacute;n funciona: los usuarios suben un archivo y aparece en la p&aacute;gina.<\/p><p>Pero nadie comprueba qu&eacute; tipos de archivos se permiten.<\/p><p>Una persona atacante puede subir un archivo malicioso, como un script disfrazado de imagen. Cuando el sistema procesa o entrega ese archivo, puede ejecutar c&oacute;digo malicioso o dejar expuesta la aplicaci&oacute;n.<\/p><p>En un flujo de trabajo tradicional, quien revisa lo detectar&iacute;a pronto. Aplicar&iacute;an restricciones a los tipos de archivo, validar&iacute;an las subidas de archivos y bloquear&iacute;an los archivos ejecutables antes del lanzamiento.<\/p><p>En un flujo de trabajo de vibe coding, ese paso de revisi&oacute;n suele omitirse porque la funci&oacute;n ya parece terminada.<\/p><h2 class=\"wp-block-heading\" id=\"h-como-proteger-los-flujos-de-trabajo-del-vibe-coding\">C&oacute;mo proteger los flujos de trabajo del vibe coding<\/h2><p>Para mantener tu flujo de trabajo seguro al usar IA, sigue estos pasos en tu proceso de desarrollo:<\/p><ul class=\"wp-block-list\">\n<li><strong>Paso 1: revisa el c&oacute;digo generado por IA.<\/strong> Revisa cada resultado antes de usarlo y comprueba c&oacute;mo gestiona las entradas, los permisos y los errores.<\/li>\n\n\n\n<li><strong>Paso 2: no incluyas datos confidenciales en tu c&oacute;digo.<\/strong> Guarda las claves de API y los tokens en variables de entorno o en un gestor de secretos.<\/li>\n\n\n\n<li><strong>Paso 3: configura la autenticaci&oacute;n y la autorizaci&oacute;n desde el principio. <\/strong>Exige autenticaci&oacute;n y aplica el control de acceso en cada solicitud.<\/li>\n\n\n\n<li><strong>Paso 4: revisa y limpia todos los datos introducidos por la persona usuaria. <\/strong>Acepta solo los formatos previstos y maneja los datos de forma segura antes de usarlos.<\/li>\n\n\n\n<li><strong>Paso 5: revisa las dependencias con regularidad.<\/strong> Escanea vulnerabilidades y mant&eacute;n los paquetes actualizados.<\/li>\n\n\n\n<li><strong>Paso 6: limita a qu&eacute; pueden acceder los agentes de IA.<\/strong> Da solo el acceso necesario y restringe todo lo dem&aacute;s.<\/li>\n<\/ul><h3 class=\"wp-block-heading\">1. Valida todo el c&oacute;digo generado por IA<\/h3><p>Revisa cada contenido generado por IA antes de usarlo en tu base de c&oacute;digo.<\/p><p><strong>Empieza probando c&oacute;mo el c&oacute;digo maneja la entrada del usuario. <\/strong>Introduce datos no v&aacute;lidos directamente en la interfaz de usuario o en la API:<\/p><ul class=\"wp-block-list\">\n<li>Escribe letras en los campos num&eacute;ricos<\/li>\n\n\n\n<li>Env&iacute;a formularios vac&iacute;os<\/li>\n\n\n\n<li>Pega scripts como <strong>alert(1)<\/strong><\/li>\n<\/ul><p>El sistema debe rechazar estas entradas con errores claros. Si las acepta o falla, falta validaci&oacute;n.<\/p><p><strong>A continuaci&oacute;n, comprueba el control de acceso modificando las solicitudes.<\/strong> Inicia sesi&oacute;n como un usuario y luego:<\/p><ul class=\"wp-block-list\">\n<li>Cambia los ID en las URL (p. ej. <strong>\/orders\/123<\/strong> &rarr; <strong>\/orders\/124<\/strong>)<\/li>\n\n\n\n<li>Repite las solicitudes a la API con distintos datos de usuario<\/li>\n<\/ul><p>Si puedes acceder a los datos de otra persona usuaria, falta autorizaci&oacute;n.<\/p><p><strong>Escanea el c&oacute;digo en busca de secretos. <\/strong>Busca en tu proyecto patrones como:<\/p><ul class=\"wp-block-list\">\n<li>API_KEY =<\/li>\n\n\n\n<li>password =<\/li>\n<\/ul><p>Elimina cualquier valor codificado de forma fija y p&aacute;salo a variables de entorno.<\/p><p><strong>Revisa las dependencias introducidas por la IA. <\/strong>Mira <strong>package.json<\/strong> o los archivos de requisitos y:<\/p><ul class=\"wp-block-list\">\n<li>Busca el nombre del paquete en Google o GitHub<\/li>\n\n\n\n<li>Comprueba la fecha de la &uacute;ltima actualizaci&oacute;n y el n&uacute;mero de personas usuarias<\/li>\n\n\n\n<li>Ejecuta un an&aacute;lisis con herramientas como <strong>Snyk<\/strong> o <strong>npm audit<\/strong> <\/li>\n<\/ul><p>No instales paquetes que no puedas verificar.<\/p><p><strong>Prueba directamente los casos de fallo. <\/strong>Haz que la funcionalidad falle a prop&oacute;sito:<\/p><ul class=\"wp-block-list\">\n<li>Env&iacute;a solicitudes incompletas<\/li>\n\n\n\n<li>Elimina los campos obligatorios<\/li>\n\n\n\n<li>Simula sesiones caducadas<\/li>\n<\/ul><p>El sistema deber&iacute;a devolver errores, no fallar ni exponer datos.<\/p><p><strong>Por &uacute;ltimo, compara el c&oacute;digo con los patrones existentes en tu proyecto. <\/strong>Revisa c&oacute;mo funciones similares gestionan la validaci&oacute;n, los permisos y el acceso a los datos, y aseg&uacute;rate de que el c&oacute;digo nuevo siga la misma estructura.<\/p><h3 class=\"wp-block-heading\">2. Evita incrustar secretos en el c&oacute;digo<\/h3><p>Nunca guardes secretos directamente en tu c&oacute;digo.<\/p><p><strong>No incluyas secretos directamente en el c&oacute;digo<\/strong>. Guarda las claves de la API, las contrase&ntilde;as y los tokens fuera del c&oacute;digo.<br>Def&iacute;nelos en tu entorno:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">API_KEY=abc123<\/pre><p>Luego accede a ellos en tu c&oacute;digo:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">const apiKey = process.env.API_KEY;<\/pre><p>As&iacute; mantienes los secretos fuera de tu base de c&oacute;digo.<\/p><p>Antes de cada commit, comprueba si hay filtraciones con herramientas como <strong>git-secrets<\/strong> o <strong>Gitleaks<\/strong>. Estas herramientas analizan tu c&oacute;digo y bloquean los commits que contienen datos confidenciales.<\/p><p><strong>Guarda las credenciales sensibles en un gestor de secretos para los sistemas de producci&oacute;n.<\/strong> Usa herramientas como AWS Secrets Manager, HashiCorp Vault o Doppler para almacenar y acceder a los secretos de forma segura durante el tiempo de ejecuci&oacute;n en lugar de guardarlos en archivos locales.<\/p><p><strong>Restringe el acceso a cada secreto. <\/strong>Solo los servicios o las partes de tu sistema que necesiten un secreto deben poder leerlo.<\/p><p><strong>Renueva los secretos peri&oacute;dicamente. <\/strong>Sustituye las claves de API y las contrase&ntilde;as de forma peri&oacute;dica o inmediatamente despu&eacute;s de cualquier sospecha de exposici&oacute;n.<\/p><p>Por &uacute;ltimo, comprueba si hay exposici&oacute;n. Sube el c&oacute;digo a un repositorio privado y comprueba que no aparezca ninguna informaci&oacute;n confidencial en:<\/p><ul class=\"wp-block-list\">\n<li>Historial de commits<\/li>\n\n\n\n<li>Registros<\/li>\n\n\n\n<li>Mensajes de error<\/li>\n<\/ul><p>Si una clave secreta aparece en cualquier parte de tu c&oacute;digo o de los registros, consid&eacute;rala comprometida y reempl&aacute;zala de inmediato.<\/p><h3 class=\"wp-block-heading\">3. Implementa la autenticaci&oacute;n y la autorizaci&oacute;n desde el principio<\/h3><p>Configura la autenticaci&oacute;n y la autorizaci&oacute;n desde el inicio de tu proyecto.<\/p><p><strong>A&ntilde;ade comprobaciones de autenticaci&oacute;n a todas las rutas que no sean p&uacute;blicas. <\/strong>En tu backend, protege las rutas con middleware o validaciones de acceso, por ejemplo, middleware de JWT o comprobaciones de sesi&oacute;n. Cada solicitud debe verificar que hayas iniciado sesi&oacute;n antes de devolver datos.<\/p><p>Compru&eacute;balo abriendo las rutas en una ventana privada del navegador o usando una herramienta como <strong>Postman<\/strong> sin iniciar sesi&oacute;n. La solicitud deber&iacute;a devolver un error, como <strong>401 Unauthorized<\/strong>.<\/p><p><strong>A continuaci&oacute;n, aplica la autorizaci&oacute;n en cada solicitud.<\/strong> Despu&eacute;s de confirmar que la persona usuaria ha iniciado sesi&oacute;n, comprueba a qu&eacute; puede acceder. En la l&oacute;gica de backend, compara el ID de la persona usuaria autenticada con el del propietario del recurso.<\/p><p>Por ejemplo, cuando gestiones una solicitud como <strong>\/orders\/123<\/strong>, obt&eacute;n el pedido y verifica:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">if (order.userId !== currentUser.id) {\n  return res.status(403).send(\"Forbidden\");\n}<\/pre><p>Ponlo a prueba iniciando sesi&oacute;n como una persona usuaria e intentando acceder a los datos de otra al cambiar los ID en la URL o en la solicitud a la API. El sistema debe devolver un error <strong>403 Forbidden<\/strong>.<\/p><p><strong>No conf&iacute;es en los ID que vienen del cliente. <\/strong>Val&iacute;dalos siempre en el servidor. Aunque el frontend oculte ciertos datos, asume que las personas usuarias pueden modificar las solicitudes manualmente.<\/p><p><strong>Aplica la misma l&oacute;gica de control de acceso en toda la aplicaci&oacute;n. <\/strong>Usa middleware, funciones auxiliares o pol&iacute;ticas compartidas en lugar de escribir comprobaciones personalizadas para cada endpoint. Esto evita que queden rutas sin proteger.<\/p><p><strong>Prueba directamente los escenarios no autorizados. <\/strong>Usa herramientas como Postman o las herramientas de desarrollo del navegador para:<\/p><ul class=\"wp-block-list\">\n<li>Elimina los tokens de autenticaci&oacute;n<\/li>\n\n\n\n<li>Modifica las cargas &uacute;tiles de las solicitudes<\/li>\n\n\n\n<li>Repite las solicitudes con distintos datos de usuario<\/li>\n<\/ul><p>Se debe bloquear toda solicitud no autorizada.<\/p><p><strong>Por &uacute;ltimo, incluye comprobaciones de autenticaci&oacute;n y autorizaci&oacute;n al desarrollar cada nueva funcionalidad. <\/strong>No los a&ntilde;adas m&aacute;s tarde. Cuando crees un nuevo endpoint, empieza por a&ntilde;adir la protecci&oacute;n primero y luego implementa la l&oacute;gica de la funcionalidad.<\/p><h3 class=\"wp-block-heading\">4. Sanitiza y valida las entradas de usuario<\/h3><p>Trata toda entrada de usuario como no segura y val&iacute;dala antes de usarla en cualquier parte de tu sistema.<\/p><p><strong>Empieza a&ntilde;adiendo reglas de validaci&oacute;n en tu backend. <\/strong>Usa una biblioteca de validaci&oacute;n como <strong>Joi<\/strong>, <strong>Zod<\/strong> o los validadores integrados del framework para definir qu&eacute; debe aceptar cada campo.<\/p><p>Por ejemplo:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">const schema = z.object({\n  email: z.string().email(),\n  age: z.number().int().min(0)\n});<\/pre><p>Ejecuta esta validaci&oacute;n antes de procesar la solicitud. Si la entrada no coincide con el esquema, devuelve un error y det&eacute;n la ejecuci&oacute;n:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">if (!schema.safeParse(req.body).success) {\n  return res.status(400).send(\"Invalid input\");\n}<\/pre><p>No intentes corregir una entrada no v&aacute;lida. Rech&aacute;zala y p&iacute;dele a la persona usuaria que env&iacute;e los datos correctos.<\/p><p>A continuaci&oacute;n, sanitiza los datos antes de usarlos en consultas o mostrarlos en una p&aacute;gina. Usa protecciones integradas, como motores de plantillas que escapan el HTML de forma predeterminada y bibliotecas como DOMPurify para el contenido generado por usuarios.<\/p><p>Para las consultas a la base de datos, usa siempre consultas parametrizadas en lugar de concatenar cadenas:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ safe\ndb.query(\"SELECT * FROM users WHERE email = ?\", [email]);\n\n\/\/ unsafe\ndb.query(`SELECT * FROM users WHERE email = '${email}'`);<\/pre><p>Prueba directamente c&oacute;mo gestionas la entrada. Prueba:<\/p><ul class=\"wp-block-list\">\n<li>Introduce scripts como <strong>&lt;script&gt;alert(1)&lt;\/script&gt;<\/strong><\/li>\n\n\n\n<li>Enviar cadenas largas o inesperadas<\/li>\n\n\n\n<li>Enviar formatos no v&aacute;lidos a trav&eacute;s de herramientas de API como Postman<\/li>\n<\/ul><p>El sistema debe rechazar la entrada o escapar de ella de forma segura. No debe ejecutar c&oacute;digo ni devolver datos inesperados.<\/p><p>Si tu aplicaci&oacute;n incluye la carga de archivos, restringe los tipos y tama&ntilde;os de archivo en el servidor. No conf&iacute;es en las comprobaciones del lado del cliente.<\/p><p><strong>Por &uacute;ltimo, aplica las mismas reglas de validaci&oacute;n y saneamiento a cada fuente de entrada. <\/strong>Esto incluye formularios, solicitudes de API, par&aacute;metros de URL y cargas de archivos. No des por hecho que una entrada es segura solo porque proviene de tu frontend.<\/p><h3 class=\"wp-block-heading\">5. Supervisa las dependencias de forma continua<\/h3><p>Haz un seguimiento de todas las dependencias de tu proyecto y rev&iacute;salas peri&oacute;dicamente para detectar vulnerabilidades conocidas.<\/p><p><strong>Empieza por ejecutar un an&aacute;lisis de dependencias en tu entorno local. <\/strong>Usa herramientas integradas como:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">npm audit<\/pre><p>o<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">pip-audit<\/pre><p>Esto muestra las vulnerabilidades conocidas en tus dependencias actuales.<\/p><p><strong>A continuaci&oacute;n, automatiza esto en tu flujo de trabajo. <\/strong>A&ntilde;ade a tu repositorio un esc&aacute;ner de dependencias como <strong>Dependabot<\/strong>, <strong>Snyk<\/strong> o <strong>Aikido<\/strong>. Por ejemplo, activa Dependabot en GitHub para que analice autom&aacute;ticamente tus dependencias y abra pull requests con correcciones de seguridad.<\/p><p>Esto elimina la necesidad de comprobarlo manualmente.<\/p><p>Antes de instalar cualquier paquete, compru&eacute;balo manualmente:<\/p><ul class=\"wp-block-list\">\n<li>Busca el nombre del paquete en npm o PyPI<\/li>\n\n\n\n<li>Comprueba la fecha de la &uacute;ltima actualizaci&oacute;n<\/li>\n\n\n\n<li>Comprueba el n&uacute;mero de descargas o de estrellas en GitHub<\/li>\n<\/ul><p>Si el paquete no tiene actividad o parece sospechoso, no lo instales.<\/p><p>Fija las versiones de tus dependencias para evitar cambios inesperados. Usa archivos de bloqueo como:<\/p><ul class=\"wp-block-list\">\n<li>package-lock.json<\/li>\n\n\n\n<li>yarn.lock<\/li>\n\n\n\n<li>requirements.txt<\/li>\n<\/ul><p>Evita versiones flexibles como:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\"library\": \"^1.0.0\"<\/pre><p>Usa versiones fijas en su lugar:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\"library\": \"1.0.0\"<\/pre><p>Actualiza las dependencias con regularidad. Cuando una herramienta marca una vulnerabilidad:<\/p><ol class=\"wp-block-list\">\n<li>Ejecuta la actualizaci&oacute;n (<strong>npm update<\/strong> o algo similar)<\/li>\n\n\n\n<li>Revisa qu&eacute; cambi&oacute;<\/li>\n\n\n\n<li>Prueba la funci&oacute;n afectada<\/li>\n<\/ol><p>No retrases las actualizaciones, porque las vulnerabilidades conocidas se suelen explotar activamente.<\/p><p>Elimina las dependencias que no uses revisando los archivos de tu proyecto. Si un paquete no se importa ni se usa en ninguna parte, elim&iacute;nalo y ejecuta:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">npm uninstall package-name<\/pre><p>Esto reduce los riesgos innecesarios.<\/p><p>Despu&eacute;s de cada actualizaci&oacute;n, prueba la funci&oacute;n que depende de ese paquete. Por ejemplo:<\/p><ul class=\"wp-block-list\">\n<li>actualiza la biblioteca de cargas &rarr; prueba la carga de archivos<\/li>\n\n\n\n<li>actualiza la biblioteca de autenticaci&oacute;n &rarr; prueba el flujo de inicio de sesi&oacute;n<\/li>\n<\/ul><p>Por &uacute;ltimo, comprueba que todo funcione y que no quede ninguna vulnerabilidad:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">npm audit<\/pre><p>El an&aacute;lisis no deber&iacute;a detectar ning&uacute;n problema cr&iacute;tico.<\/p><h3 class=\"wp-block-heading\">6. Limita los permisos de los agentes de IA<\/h3><p>Dale a cada agente de IA solo el acceso que necesita para completar su tarea.<\/p><p>Empieza por definir de forma concreta el alcance del agente. Escribe exactamente lo que debe hacer, por ejemplo: &ldquo;Leer tickets de soporte desde la API <strong>\/tickets<\/strong>&rdquo; o &ldquo;Resumir los archivos de la carpeta <strong>\/reports<\/strong>&ldquo;.<\/p><p>Crea credenciales restringidas en lugar de usar claves con acceso completo. Cuando generes una clave o un token de API, configura los permisos para permitir solo acciones espec&iacute;ficas. Por ejemplo:<\/p><ul class=\"wp-block-list\">\n<li>Permitir: <strong>GET \/tickets<\/strong> <\/li>\n\n\n\n<li>Bloquear: <strong>POST<\/strong>, <strong>DELETE<\/strong> o acciones de administraci&oacute;n<\/li>\n<\/ul><p>Evita usar credenciales de root, admin o de acceso total.<\/p><p>Limita el acceso a recursos espec&iacute;ficos. En tu sistema o proveedor en la nube:<\/p><ul class=\"wp-block-list\">\n<li>Concede acceso a una sola carpeta en lugar de a todo el bucket de almacenamiento<\/li>\n\n\n\n<li>Permite una sola tabla de la base de datos en lugar de toda la base de datos<\/li>\n\n\n\n<li>Restringe las API a endpoints espec&iacute;ficos<\/li>\n<\/ul><p>Usa roles de IAM o pol&iacute;ticas de permisos para aplicar esto.<\/p><p>Empieza con acceso de solo lectura. Asigna permisos que solo permitan leer datos. Luego prueba el agente. A&ntilde;ade permisos de escritura o eliminaci&oacute;n solo si la tarea falla sin ellos.<\/p><p>Primero, ejecuta el agente en un entorno de prueba. Con&eacute;ctalo a los datos del entorno de pruebas en lugar de a producci&oacute;n. Verifica c&oacute;mo funciona antes de darle acceso a personas reales o a sistemas.<\/p><p>Prueba los permisos intentando vulnerarlos. Usa el agente o la API manualmente para:<\/p><ul class=\"wp-block-list\">\n<li>Acceder a otra carpeta<\/li>\n\n\n\n<li>Modificar datos cuando solo deber&iacute;a leer<\/li>\n\n\n\n<li>Invocar endpoints fuera de su &aacute;mbito<\/li>\n<\/ul><p>Cada intento deber&iacute;a fallar con una respuesta de &ldquo;acceso denegado&rdquo; o &ldquo;<strong>403 Forbidden<\/strong>&ldquo;.<\/p><p>Activa el registro de todas las acciones del agente. Registra:<\/p><ul class=\"wp-block-list\">\n<li>A qu&eacute; archivos accede<\/li>\n\n\n\n<li>A qu&eacute; API llama<\/li>\n\n\n\n<li>Qu&eacute; acciones realiza<\/li>\n<\/ul><p>Revisa los registros despu&eacute;s de ejecutar el agente. Confirma que solo realiza las acciones que definiste antes.<\/p><p>Si el agente puede hacer m&aacute;s de lo previsto, reduce sus permisos y vuelve a probar.<\/p><h2 class=\"wp-block-heading\" id=\"h-que-herramientas-ayudan-a-proteger-el-codigo-generado-por-ia\">&iquest;Qu&eacute; herramientas ayudan a proteger el c&oacute;digo generado por IA?<\/h2><p>Las <a data-wpel-link=\"internal\" href=\"\/es\/tutoriales\/las-mejores-herramientas-de-vibe-coding\" rel=\"follow\">herramientas de vibe coding<\/a> te ayudan a crear aplicaciones r&aacute;pidamente, pero no las protegen de forma predeterminada. Para proteger el c&oacute;digo generado por IA, necesitas un conjunto independiente de herramientas que se divide en tres grupos: an&aacute;lisis de c&oacute;digo, an&aacute;lisis de dependencias y protecci&oacute;n en tiempo de ejecuci&oacute;n.<\/p><p>Herramientas como Aikido, Snyk y CodeAnt cubren distintas partes de este flujo de trabajo, mientras que la matriz de controles de IA de CSA ayuda a definir qu&eacute; controles aplicar.<\/p><p><strong>An&aacute;lisis de c&oacute;digo (SAST)<\/strong> <\/p><p>Las pruebas est&aacute;ticas de seguridad de aplicaciones o <strong>SAST<\/strong>, analizan el c&oacute;digo fuente en busca de patrones de riesgo antes de que lo publiques.<\/p><p>Esto te resulta &uacute;til para detectar problemas en el c&oacute;digo generado por IA, como el manejo inseguro de entradas, secretos expuestos o una l&oacute;gica d&eacute;bil en las pull requests y los IDE. Las herramientas de este grupo incluyen <strong>Aikido<\/strong>, <strong>CodeAnt<\/strong> y <strong>Snyk Code<\/strong>.<\/p><p><strong>An&aacute;lisis de dependencias<\/strong> <\/p><p>Los esc&aacute;neres de dependencias revisan los paquetes de terceros de los que depende tu c&oacute;digo y se&ntilde;alan las vulnerabilidades conocidas. Esto importa en el vibe coding porque la IA puede sugerir bibliotecas desactualizadas o incluso nombres de paquetes que debes verificar antes de instalarlos.<\/p><p><strong>Snyk<\/strong> y <strong>Aikido<\/strong> analizan las dependencias de c&oacute;digo abierto y CodeAnt tambi&eacute;n incluye an&aacute;lisis de composici&oacute;n de software en su plataforma. <\/p><p><strong>Protecci&oacute;n en tiempo de ejecuci&oacute;n<\/strong> <\/p><p>Algunos problemas solo aparecen con tr&aacute;fico real, no durante la revisi&oacute;n del c&oacute;digo. La protecci&oacute;n en tiempo de ejecuci&oacute;n supervisa lo que sucede despu&eacute;s de implementar el c&oacute;digo y ayuda a detectar o bloquear ataques en vivo. <\/p><p><strong>Aikido<\/strong> es un ejemplo de plataforma que va m&aacute;s all&aacute; del an&aacute;lisis de c&oacute;digo y dependencias para detectar y bloquear amenazas en tiempo de ejecuci&oacute;n. <\/p><p><strong>D&oacute;nde encaja CSA<\/strong> <\/p><p><strong>CSA<\/strong> es diferente de las herramientas anteriores. No es un esc&aacute;ner. La <strong>matriz de controles de IA<\/strong> de Cloud Security Alliance es un marco de controles neutral respecto a proveedores para proteger sistemas de IA, por lo que te conviene usarla para definir tu proceso, revisar los requisitos y establecer una base de seguridad en torno al c&oacute;digo generado por IA.<\/p><h2 class=\"wp-block-heading\" id=\"h-checklist-de-seguridad-para-el-vibe-coding\">Checklist de seguridad para el vibe coding<\/h2><div class=\"wp-block-image\">\n<figure data-wp-context='{\"imageId\":\"6a3be003dc556\"}' data-wp-interactive=\"core\/image\" data-wp-key=\"6a3be003dc556\" class=\"aligncenter size-full wp-lightbox-container\"><img decoding=\"async\" width=\"812\" height=\"458\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/32\/2026\/06\/diagrama-de-lista-de-comprobacion.png\/public\" alt=\"Se muestran seis buenas pr&aacute;cticas de ciberseguridad en iconos y bloques de texto, entre ellas no codificar secretos de forma fija, revisar el c&oacute;digo generado por IA y limitar los permisos. Se muestra el logotipo de Hostinger.\" class=\"wp-image-54264\" srcset=\"https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/32\/2026\/06\/diagrama-de-lista-de-comprobacion.png\/w=812,fit=scale-down 812w, https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/32\/2026\/06\/diagrama-de-lista-de-comprobacion.png\/w=300,fit=scale-down 300w, https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/32\/2026\/06\/diagrama-de-lista-de-comprobacion.png\/w=150,fit=scale-down 150w, https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/32\/2026\/06\/diagrama-de-lista-de-comprobacion.png\/w=768,fit=scale-down 768w\" sizes=\"(max-width: 812px) 100vw, 812px\" \/><button class=\"lightbox-trigger\" type=\"button\" aria-haspopup=\"dialog\" aria-label=\"Enlarge\" data-wp-init=\"callbacks.initTriggerButton\" data-wp-on--click=\"actions.showLightbox\" data-wp-style--right=\"state.imageButtonRight\" data-wp-style--top=\"state.imageButtonTop\">\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewbox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\"><\/path>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n<\/div><p>Usa esta lista de verificaci&oacute;n como una forma r&aacute;pida de detectar los riesgos m&aacute;s comunes antes de que el c&oacute;digo llegue a producci&oacute;n.<\/p><ul class=\"wp-block-list\">\n<li><strong>No incrustes secretos en el c&oacute;digo<\/strong>: mant&eacute;n las claves de API, las contrase&ntilde;as y los tokens fuera del c&oacute;digo y gu&aacute;rdalos en variables de entorno o en un gestor de secretos.<\/li>\n\n\n\n<li><strong>Revisa todo el c&oacute;digo generado por IA<\/strong>: trata el resultado de la IA como un borrador y comprueba c&oacute;mo maneja la entrada de datos, el control de acceso y los datos sensibles antes de usarlo.<\/li>\n\n\n\n<li><strong>Exige autenticaci&oacute;n de forma predeterminada<\/strong>: haz que iniciar sesi&oacute;n sea lo habitual en cualquier funci&oacute;n no p&uacute;blica para que los endpoints no queden abiertos por accidente.<\/li>\n\n\n\n<li><strong>Analiza las dependencias para detectar vulnerabilidades conocidas<\/strong>: revisa peri&oacute;dicamente los paquetes de terceros para evitar incorporar c&oacute;digo inseguro o desactualizado en tu aplicaci&oacute;n.<\/li>\n\n\n\n<li><strong>Valida y sanitiza las entradas de las personas usuarias<\/strong>: aseg&uacute;rate de que todas coincidan con los formatos esperados y no puedan usarse para inyectar c&oacute;digo malicioso.<\/li>\n\n\n\n<li><strong>Limita los permisos de los agentes y las herramientas de IA<\/strong>: dales solo el acceso m&iacute;nimo necesario para que los errores o los usos indebidos queden contenidos.<\/li>\n<\/ul><h2 class=\"wp-block-heading\" id=\"h-que-debes-saber-antes-de-usar-vibe-coding-en-produccion\">Qu&eacute; debes saber antes de usar vibe coding en producci&oacute;n<\/h2><p>El vibe coding te permite avanzar m&aacute;s r&aacute;pido, pero tambi&eacute;n aumenta el riesgo de seguridad.<\/p><p>La IA te permite generar funcionalidades que funcionan r&aacute;pidamente, pero un c&oacute;digo m&aacute;s r&aacute;pido no significa necesariamente que sea m&aacute;s seguro. Cuando se produce m&aacute;s c&oacute;digo en menos tiempo, resulta m&aacute;s f&aacute;cil pasar por alto las revisiones y no detectar problemas de seguridad.<\/p><p>Esto cambia la forma en que necesitas enfocar el desarrollo. No trates el c&oacute;digo generado por IA como si fuera de confianza. Tr&aacute;talo como un borrador que debes revisar, probar y validar antes de publicarlo.<\/p><p>Por ejemplo, la IA puede generar un panel de control funcional en cuesti&oacute;n de minutos. Las p&aacute;ginas cargan y los datos aparecen, pero sin comprobaciones de acceso adecuadas, las personas usuarias pueden ver datos que no deber&iacute;an. La funci&oacute;n funciona, pero no es segura.<\/p><p>Para usar el vibe coding de forma segura en producci&oacute;n, sigue por defecto las mejores pr&aacute;cticas de seguridad para aplicaciones web. Exige autenticaci&oacute;n, valida la entrada, protege los secretos, revisa las dependencias y limita los permisos.<\/p><p>La seguridad tambi&eacute;n debe integrarse en tu flujo de trabajo. No conf&iacute;es en las comprobaciones manuales al final. A&ntilde;ade an&aacute;lisis automatizados, exige revisiones y prueba los casos l&iacute;mite como parte del desarrollo.<\/p><p>La plataforma que usas tambi&eacute;n influye en lo seguro que puede ser crear y lanzar apps generadas con IA. Por ejemplo, la <a href=\"\/es\/horizons\">herramienta de vibe coding<\/a> de <strong>Hostinger Horizons<\/strong> combina la creaci&oacute;n de apps a partir de prompts, hosting integrado y publicaci&oacute;n con 1 clic en un solo entorno, lo que reduce el trabajo de configuraci&oacute;n que suele dar lugar a errores durante el despliegue.<\/p><p>Tambi&eacute;n incluye protecciones a nivel de infraestructura, como un firewall, an&aacute;lisis de malware y protecci&oacute;n contra ataques DDoS, junto con funciones como el historial de versiones del proyecto y soporte de backend integrado para cuentas, inicios de sesi&oacute;n y almacenamiento de datos. <\/p><p>Esto ayuda a acelerar el lanzamiento y a reforzar la seguridad operativa, pero no sustituye la seguridad a nivel de aplicaci&oacute;n. A&uacute;n necesitas revisar la l&oacute;gica generada, validar las entradas, aplicar autenticaci&oacute;n y autorizaci&oacute;n, proteger los secretos y probar c&oacute;mo se comporta la app antes de publicarla.<\/p><figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.hostinger.com\/es\/horizons\"><img decoding=\"async\" width=\"1024\" height=\"300\" src=\"https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/32\/2025\/03\/ES_Horizons_in-text-banner.png\/w=1024,h=1024,fit=scale-down\" alt=\"\" class=\"wp-image-45699\" srcset=\"https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/32\/2025\/03\/ES_Horizons_in-text-banner.png\/w=1024,fit=scale-down 1024w, https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/32\/2025\/03\/ES_Horizons_in-text-banner.png\/w=300,fit=scale-down 300w, https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/32\/2025\/03\/ES_Horizons_in-text-banner.png\/w=150,fit=scale-down 150w, https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/32\/2025\/03\/ES_Horizons_in-text-banner.png\/w=768,fit=scale-down 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>La seguridad en el vibe coding consiste en mantener seguras las aplicaciones generadas con IA mediante la revisi&oacute;n del c&oacute;digo, las dependencias, los controles de acceso y los procesos de desarrollo. El vibe coding consiste en generar c&oacute;digo con IA mediante prompts en lenguaje natural en lugar de escribirlo todo manualmente. Esto acelera el desarrollo, [&#8230;]<\/p>\n<p><a class=\"btn btn-secondary understrap-read-more-link\" href=\"\/es\/tutoriales\/seguridad-en-vibe-coding\">Read More&#8230;<\/a><\/p>\n","protected":false},"author":190,"featured_media":54010,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"rank_math_title":"Seguridad en vibe coding: riesgos y buenas pr\u00e1cticas","rank_math_description":"Descubre los principales riesgos de seguridad del vibe coding y c\u00f3mo evitarlos con consejos pr\u00e1cticos para crear apps con IA de forma m\u00e1s segura.","rank_math_focus_keyword":"seguridad en vibe coding","footnotes":""},"categories":[14488],"tags":[],"class_list":["post-54019","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-hostinger-horizons"],"hreflangs":[{"locale":"es-ES","link":"https:\/\/www.hostinger.com\/es\/tutoriales\/seguridad-en-vibe-coding\/","default":0},{"locale":"es-AR","link":"https:\/\/www.hostinger.com\/ar\/tutoriales\/seguridad-en-vibe-coding\/","default":0},{"locale":"es-MX","link":"https:\/\/www.hostinger.com\/mx\/tutoriales\/seguridad-en-vibe-coding\/","default":0},{"locale":"es-CO","link":"https:\/\/www.hostinger.com\/co\/tutoriales\/seguridad-en-vibe-coding\/","default":0}],"acf":[],"_links":{"self":[{"href":"https:\/\/www.hostinger.com\/es\/tutoriales\/wp-json\/wp\/v2\/posts\/54019","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.hostinger.com\/es\/tutoriales\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.hostinger.com\/es\/tutoriales\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.hostinger.com\/es\/tutoriales\/wp-json\/wp\/v2\/users\/190"}],"replies":[{"embeddable":true,"href":"https:\/\/www.hostinger.com\/es\/tutoriales\/wp-json\/wp\/v2\/comments?post=54019"}],"version-history":[{"count":12,"href":"https:\/\/www.hostinger.com\/es\/tutoriales\/wp-json\/wp\/v2\/posts\/54019\/revisions"}],"predecessor-version":[{"id":54268,"href":"https:\/\/www.hostinger.com\/es\/tutoriales\/wp-json\/wp\/v2\/posts\/54019\/revisions\/54268"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.hostinger.com\/es\/tutoriales\/wp-json\/wp\/v2\/media\/54010"}],"wp:attachment":[{"href":"https:\/\/www.hostinger.com\/es\/tutoriales\/wp-json\/wp\/v2\/media?parent=54019"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.hostinger.com\/es\/tutoriales\/wp-json\/wp\/v2\/categories?post=54019"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.hostinger.com\/es\/tutoriales\/wp-json\/wp\/v2\/tags?post=54019"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}