In this article
Cómo ayudar a Gemini Code Assist a generar código seguro
El lanzamiento de Gemini Code Assist de Google ofrece un asistente de programación para IDE que los desarrolladores pueden aprovechar en sus tareas diarias. ¿Cómo podemos asegurarnos de que los LLM generen código seguro?
La verdad, me gusta mucho la interfaz minimalista de Gemini Code Assist. Es muy sencilla y no tiene botones de interfaz llamativos. Es simple y directa: aprovecha al máximo el espacio y la experiencia de chat para centrarse en tareas de programación con agentes, y presenta con claridad los detalles de su razonamiento durante todo el proceso.
Démosle una tarea de programación a Gemini Code Assist y veamos cómo funciona la programación impulsada por LLM y cómo Snyk ayuda a proteger el código de GenAI.
Requisitos previos para este tutorial paso a paso sobre cómo proteger el código generado por IA:
VS Code (¡gratis!)
Gemini Code Assist de Google (¡gratis!)
Asegúrate de habilitar el modo “Insiders” de Gemini Code Assist agregando la siguiente directiva a la configuración de usuario de VS Code:
"geminicodeassist.updateChannel":"Insiders",
Snyk CLI (¡gratis!)
Extensión de Snyk para VS Code IDE (¡gratis!)
¿Cómo guardar de forma segura las fotos de perfil de los usuarios en Node.js?
Ya tengo una aplicación Node.js funcional que utiliza el framework web Express y está conectada a una base de datos MongoDB y al motor de plantillas Handlebars.
El archivo index.js en routes/ incluye un controlador de rutas llamado save_account_details, que ya se encarga de guardar los datos de la cuenta del usuario en su perfil y de mostrarle esa información.
La implementación del código JavaScript en el servidor Node.js es la siguiente:
exports.save_account_details = function(req, res, next) {
// get the profile details from the JSON
const profile = req.body
// validate the input
if (validator.isEmail(profile.email, { allow_display_name: true })
// allow_display_name allows us to receive input as:
// Display Name <email-address>
// which we consider valid too
&& validator.isMobilePhone(profile.phone, 'he-IL')
&& validator.isAscii(profile.firstname)
&& validator.isAscii(profile.lastname)
&& validator.isAscii(profile.country)
) {
// trim any extra spaces on the right of the name
profile.firstname = validator.rtrim(profile.firstname)
profile.lastname = validator.rtrim(profile.lastname)
// render the view
return res.render('account.hbs', profile)
} else {
// if input validation fails, we just render the view as is
console.log('error in form details')
return res.render('account.hbs')
}
}Como puedes ver, hay varias validaciones para asegurarse de que los datos del perfil del usuario, como el correo electrónico y otros detalles, coincidan con un esquema, mediante el paquete npm validator. Por ahora, el código aún no persiste los datos en la base de datos, pero podemos abordar esa tarea más adelante.
¿Qué tal si ampliamos esta funcionalidad para que los usuarios también puedan proporcionar la URL de su foto de perfil, como un avatar, y descargarla y guardarla en el disco para mejorar la experiencia de usuario?
Tarea de programación con GenAI: actualizar el perfil con el avatar del usuario
Quizás no tenemos claro cómo trabajar con solicitudes de red y la API del sistema de archivos en Node.js para obtener una URL remota y guardarla en el disco. Para esta tarea, usemos Gemini Code Assist.
Abriré la pestaña de extensiones en VS Code y le daré a Gemini Code Assist la siguiente instrucción:
Let's update the save_account_details function handler so that it takes the URL provided in the req.body.profile_picture_url property, downloads the file to the uploads/ directory and saves it to diskAquí tienes un video de todo el proceso en el que Gemini Code Assist actualiza el código:

Este es el código generado por el modelo. ¿Qué te parece?
exports.save_account_details = function(req, res, next) {
// get the profile details from the JSON
const profile = req.body
// validate the input
if (validator.isEmail(profile.email, { allow_display_name: true })
// allow_display_name allows us to receive input as:
// Display Name <email-address>
// which we consider valid too
&& validator.isMobilePhone(profile.phone, 'he-IL')
&& validator.isAscii(profile.firstname)
&& validator.isAscii(profile.lastname)
&& validator.isAscii(profile.country)
) {
// trim any extra spaces on the right of the name
profile.firstname = validator.rtrim(profile.firstname)
profile.lastname = validator.rtrim(profile.lastname)
if (profile.profile_picture_url) {
const localPath = path.join(__dirname, '../public/uploads/');
if (!fs.existsSync(localPath)) {
fs.mkdirSync(localPath)
}
const localFile = fs.createWriteStream(path.join(localPath, path.basename(profile.profile_picture_url)));
const protocol = profile.profile_picture_url.startsWith('https') ? https : http;
protocol.get(profile.profile_picture_url, function(response) {
response.pipe(localFile);
localFile.on('finish', function() {
localFile.close();
// render the view
return res.render('account.hbs', profile)
});
}).on('error', function(err) {
fs.unlink(localPath);
console.log('error in form details')
return res.render('account.hbs')
});
} else {
// render the view
return res.render('account.hbs', profile)
}
} else {
// if input validation fails, we just render the view as is
console.log('error in form details')
return res.render('account.hbs')
}
}Puede ser un poco difícil analizar el código JavaScript anterior sin un mejor resaltado de sintaxis, así que te mostraré el mismo resultado con el formato del IDE. ¿Detectas algún problema? ¿Cuántas vulnerabilidades encontraste?

Snyk AI Trust está a la altura de su nombre y protege Gemini Code Assist
Todos estos LLM y flujos de trabajo con agentes que ya adoptamos en nuestras tareas cotidianas pueden generar riesgos de seguridad de distintas formas.
Uno de esos riesgos de seguridad aparece cuando los asistentes de programación con GenAI producen código inseguro que los atacantes pueden aprovechar para perjudicarnos. El recorrido anterior es un buen ejemplo de las vulnerabilidades de seguridad que acechan cuando confiamos en la IA. Snyk está aquí para mitigar ese riesgo, ayudarte a supervisar las líneas de código generadas y corregirlas.
Cuando guardé el archivo después de los cambios realizados por Gemini Code Assist, la extensión Snyk Security, que ya está instalada en mi IDE de VS Code, se activó para analizar los cambios del archivo y encontró código vulnerable, que resaltó con la conocida línea roja ondulada que alerta a los desarrolladores:

Una sola línea de código que introduce el riesgo de dos tipos distintos de vulnerabilidad:
Estamos obteniendo la URL que proporcionó el usuario y podríamos abrir una conexión a un endpoint HTTP remoto (y no HTTPS). Por eso, Snyk nos advierte sobre el uso de un protocolo inseguro que podría provocar la transmisión de información confidencial en texto sin cifrar. Puedes leer más sobre este riesgo de seguridad en la lección de Snyk Learn Almacenamiento de información confidencial en texto sin cifrar en una cookie, que lo explica con el ejemplo de una cookie.
Además, estamos haciendo una solicitud HTTP a ciegas a una URL que controla el usuario, ¿sin validarla? ¿Y si esa supuesta URL de imagen fuera en realidad un recurso interno, como http://127.0.0.1:8080/admin_get_resources, de una empresa o de una máquina local de desarrollo? Eso es una vulnerabilidad SSRF. También hay una lección breve de Snyk Learn sobre este tema, por si quieres profundizar en los riesgos y las medidas de mitigación: Falsificación de solicitudes del lado del servidor (SSRF)
Bien, pero ¿podemos mejorar el uso de los asistentes de programación con IA para que generen código seguro desde el principio? ¡Sigue leyendo!
Combinar Gemini Code Assist con Snyk mediante MCP para flujos de trabajo seguros con agentes
Gemini Code Assist es compatible con el Model Context Protocol (MCP) en su modo con agentes. Esto significa que puede enviar solicitudes a herramientas MCP de otras integraciones, que complementan la respuesta generada por el modelo para que este adapte su resultado según la respuesta de la herramienta.
Snyk también es compatible con MCP, lo que significa que ofrece herramientas para LLM, como analizar tus dependencias de código abierto y buscar código inseguro generado por LLM. Aquí tienes una demostración detallada de Snyk MCP.
Actualicemos la configuración de MCP de Gemini Code Assist para ejecutar Snyk. Crea el archivo .gemini/settings.json y agrega lo siguiente:
{
"mcpServers": {
"snyk": {
"command": "snyk",
"args": [
"mcp",
"-t",
"stdio",
"--experimental"
]
}
}
}Si aún no lo hiciste, debes instalar Snyk CLI:
npm install -g snyk@latestLuego, autentícate ejecutando el siguiente comando y sigue las instrucciones para iniciar sesión:
snyk authPara confirmar que todo funciona, podemos hacerle una pregunta sencilla a Gemini:

Ahora sabemos que podemos combinar Gemini Code Assist con Snyk y probar los resultados de generación de código para la misma tarea que hicimos al principio: guardar en el disco la imagen que el usuario proporciona mediante una URL.
Aquí está la instrucción y ya podemos empezar.

Durante la generación de código de Gemini Code Assist, se invocará el servidor MCP de Snyk para probar el código cada vez que el LLM lo genere o actualice, y así garantizar que no tenga vulnerabilidades.

La sesión de programación duró casi 10 minutos, con varias idas y vueltas entre Gemini Code Assist y Snyk, y demuestra lo complejo que puede ser escribir código seguro. Aquí tienes el recorrido completo:

Snyk AI Trust para código de GenAI
Si te interesa aprender más sobre cómo proteger el código de GenAI, te recomiendo estos recursos:
¿Programas con vibe coding? Deberías preocuparte por el código inseguro. Lee mi ejemplo real: Programar con vibe coding una API de carga de archivos en Node.js provoca una vulnerabilidad de seguridad
¿No conoces MCP? Guía para principiantes: cómo entender visualmente la arquitectura de MCP
¿Quieres conocer la seguridad de MCP? Lee mi artículo Seguridad de MCP: lo viejo vuelve a ser nuevo
Guía rápida para prepararte para la IA
Genera confianza en la IA
Obtén una guía práctica y estructurada para ayudar a tu equipo a adoptar la IA sin introducir riesgos sin mitigar.