In this article
Como ajudar o Gemini Code Assist a gerar código seguro
O Gemini Code Assist, lançado pelo Google, é um assistente de programação integrado ao IDE que desenvolvedores podem usar nas tarefas diárias de programação. Como garantir que os LLMs gerem código seguro?
Gosto muito da interface minimalista do Gemini Code Assist. É muito simples e direta, sem botões cafonas. O layout é enxuto e aproveita bem o espaço, oferecendo uma experiência de chat que mantém o foco nas tarefas de programação agentiva e apresenta com clareza os detalhes do raciocínio ao longo do processo.
Vamos propor uma tarefa de programação ao Gemini Code Assist e ver como funciona essa programação com tecnologia de LLM e como a Snyk ajuda a proteger código GenAI.
Pré-requisitos para este tutorial passo a passo sobre como proteger código gerado por IA:
VS Code (grátis!)
Gemini Code Assist do Google (grátis!)
Ative o modo “Insiders” do Gemini Code Assist adicionando a seguinte diretiva às configurações de usuário do VS Code:
"geminicodeassist.updateChannel":"Insiders",
Snyk CLI (grátis!)
Extensão da Snyk para o VS Code IDE (grátis!)
Como salvar com segurança fotos de perfil de usuários no Node.js?
Já tenho uma aplicação Node.js funcional, criada com o framework web Express, conectada a um banco de dados MongoDB e usando o mecanismo de templates Handlebars.
O arquivo index.js em routes/ contém um manipulador de rota chamado save_account_details, que já salva os dados da conta do usuário no perfil e também exibe essas informações para os usuários.
A implementação do código JavaScript no servidor Node.js é assim:
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 você pode ver, há várias validações para garantir que os dados do perfil do usuário, como o e-mail e outras informações, estejam de acordo com um esquema. Para isso, usamos o pacote npm validator. Por enquanto, o código ainda não persiste os dados no banco de dados, mas podemos cuidar disso mais tarde.
E se quisermos ampliar essa funcionalidade para permitir que os usuários informem a URL da foto de perfil, como um avatar, e baixá-la e salvá-la em disco para oferecer uma experiência melhor?
Tarefa de programação com GenAI: atualize o perfil com o avatar do usuário
Talvez não saibamos ao certo como usar as requisições de rede e a API do sistema de arquivos no Node.js para acessar uma URL remota e salvar o arquivo em disco. Então, vamos usar o Gemini Code Assist nessa tarefa de programação.
Vou abrir a aba da extensão no VS Code e enviar o seguinte prompt ao Gemini Code Assist:
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 diskConfira neste vídeo o processo completo para atualizar o código com o Gemini Code Assist:

O modelo gerou o código abaixo. O que você acha?
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')
}
}Pode ser um pouco difícil analisar o código JavaScript acima sem um realce de sintaxe melhor. Então, vou mostrar o mesmo resultado formatado no IDE. Você consegue identificar algum problema? Quantas vulnerabilidades encontrou?

Snyk AI Trust faz jus ao nome e protege o Gemini Code Assist
Todos esses LLMs e fluxos de trabalho agentivos, já incorporados às nossas tarefas do dia a dia, podem gerar riscos de segurança de várias formas.
Um desses riscos é a geração de código inseguro por assistentes de programação com GenAI, que pode ser explorado por invasores contra nós. O passo a passo acima mostra bem as vulnerabilidades de segurança que podem surgir quando confiamos na IA. A Snyk ajuda a reduzir esse risco, permitindo que você monitore as linhas de código geradas e corrija os problemas.
Quando salvei o arquivo com as alterações feitas pelo Gemini Code Assist, a extensão Snyk Security, já instalada no meu VS Code IDE, entrou em ação para analisar as mudanças e encontrou código vulnerável, destacado pelo conhecido sublinhado vermelho ondulado que alerta os desenvolvedores:

Uma única linha de código que introduz dois tipos diferentes de vulnerabilidade:
Estamos acessando a URL informada pelo usuário e podemos acabar estabelecendo uma conexão com um endpoint HTTP remoto, em vez de HTTPS. Por isso, a Snyk alerta sobre o uso de um protocolo inseguro, que pode levar à transmissão de informações confidenciais em texto puro. Saiba mais sobre esse risco de segurança na lição do Snyk Learn sobre armazenamento de informações confidenciais em texto puro em um cookie, que explica o conceito usando cookies.
Além disso, estamos simplesmente fazendo uma requisição HTTP para uma URL controlada pelo usuário, sem validá-la? E se essa suposta URL de imagem apontar para um recurso interno, como http://127.0.0.1:8080/admin_get_resources, em um servidor da empresa ou na máquina local de um desenvolvedor? Isso é uma vulnerabilidade de SSRF. O Snyk Learn também tem uma lição rápida sobre o tema, caso você queira saber mais sobre os riscos e como reduzi-los: falsificação de requisição do lado do servidor (SSRF)
Certo, mas será que podemos aprimorar o uso de assistentes de programação com IA para que eles já gerem código seguro? Acompanhe!
Como combinar o Gemini Code Assist com a Snyk via MCP para criar fluxos de trabalho agentivos seguros
O Gemini Code Assist é compatível com o Model Context Protocol (MCP) no modo agentivo. Isso significa que ele pode enviar solicitações de ferramentas MCP para outras integrações, que complementam a resposta gerada pelo modelo. Com base na resposta da ferramenta, o modelo adapta o resultado.
A Snyk também é compatível com MCP e oferece ferramentas para LLMs, como a análise de dependências de código aberto e a detecção de código inseguro gerado por LLMs. Confira esta demonstração detalhada do Snyk MCP.
Vamos atualizar a configuração MCP do Gemini Code Assist para executar a Snyk. Crie o arquivo .gemini/settings.json e adicione o seguinte:
{
"mcpServers": {
"snyk": {
"command": "snyk",
"args": [
"mcp",
"-t",
"stdio",
"--experimental"
]
}
}
}Se ainda não fez isso, instale a Snyk CLI:
npm install -g snyk@latestEm seguida, autentique-se executando o comando abaixo e siga as instruções para fazer login:
snyk authPara confirmar que tudo está funcionando, podemos enviar um prompt simples ao Gemini:

Agora sabemos que podemos combinar o Gemini Code Assist com a Snyk e testar o resultado da geração de código para a mesma tarefa de antes: salvar em disco a imagem que o usuário forneceu por meio de uma URL.
Este é o prompt. Agora, é só começar.

Durante a geração de código pelo Gemini Code Assist, o servidor MCP da Snyk será acionado para testar o código a cada geração ou atualização feita pelo LLM, garantindo que ele não contenha vulnerabilidades.

A sessão de programação durou quase 10 minutos, com algumas idas e vindas entre o Gemini Code Assist e a Snyk, e mostra como pode ser complexo escrever código seguro. Confira o passo a passo completo:

Snyk AI Trust para código GenAI
Se quiser saber mais sobre como proteger código GenAI, recomendo muito estes recursos:
Programação por vibe? Você deveria se preocupar com código inseguro. Confira meu exemplo do mundo real: Programar por vibe uma API de upload de arquivos em Node.js gera uma vulnerabilidade de segurança
Está começando com MCP? Um guia para iniciantes sobre como entender visualmente a arquitetura do MCP
Quer uma introdução à segurança do MCP? Leia meu artigo Segurança do MCP: o que é antigo se torna novo outra vez
Guia rápido de preparação para IA
Construa confiança em IA
Tenha acesso a um guia prático e estruturado para ajudar sua equipe a adotar a IA sem introduzir riscos sem controle.