Segurança de aplicações JavaScript: top-10 vulnerabilidades para iniciantes

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Segurança de aplicações JavaScript: top 10 vulnerabilidades para iniciantes



Segurança de aplicações web é um dos tópicos mais importantes para qualquer desenvolvedor. JavaScript (especialmente no lado do servidor com Node.js) frequentemente se torna alvo de atacantes devido à sua popularidade. Neste artigo, vamos analisar as 10 vulnerabilidades mais comuns que desenvolvedores iniciantes enfrentam e mostrar como evitá-las.



1. XSS (Cross-Site Scripting)

XSS é um dos ataques mais comuns, onde um atacante insere um script malicioso em uma página web. Isso acontece quando dados do usuário são inseridos em HTML sem escape.



Código perigoso (vulnerável):

app.get('/search', (req, res) => {  const query = req.query.q;  res.send(`<h1>Resultados da busca: ${query}</h1>`);});


Código seguro (protegido):

const escapeHtml = require('escape-html');

app.get('/search', (req, res) => { const query = escapeHtml(req.query.q); res.send(`<h1>Resultados da busca: ${query}</h1>`);});


2. SQL Injection

Se você usa bancos de dados SQL (como SQLite ou PostgreSQL), consultas sem escape podem levar a vazamento de dados.



Código perigoso:

const user = req.body.username;db.query(`SELECT * FROM users WHERE name = '${user}'`);


Código seguro (usando consultas parametrizadas):

const user = req.body.username;db.query('SELECT * FROM users WHERE name = $1', [user]);


3. Desserialização insegura

Usar JSON.parse() em dados não verificados pode levar a ataques do tipo "prototype pollution".



Exemplo de vulnerabilidade:

const data = JSON.parse(req.body.jsonData);// Se data contém __proto__, isso pode alterar o protótipo de Object


Proteção: sempre valide os dados antes do parsing ou use bibliotecas como fast-json-stable-stringify.



4. Ausência de validação de entrada (Input Validation)

Nunca confie em dados vindos do usuário. Sempre verifique o tipo, comprimento e formato dos dados.



// Ruim: aceita tudoapp.post('/profile', (req, res) => {  const { name, age } = req.body;  // ...});

// Bom: validaconst schema = { name: 'string', age: 'number' };if (typeof req.body.name !== 'string') throw new Error('Invalid name');


5. CSRF (Cross-Site Request Forgery)

Ataque onde o atacante força o usuário a executar uma ação indesejada em um site onde ele está autenticado.



Proteção: use tokens CSRF.

const csrf = require('csurf');app.use(csrf({ cookie: true }));

app.get('/form', (req, res) => { res.render('form', { csrfToken: req.csrfToken() });});


6. Vazamento de informações através de erros

Nunca mostre mensagens de erro detalhadas ao usuário — isso dá aos hackers informações sobre a estrutura da sua aplicação.



Ruim:

app.use((err, req, res, next) => {  res.status(500).send(err.stack); // Vazamento da stack de chamadas!});


Bom:

app.use((err, req, res, next) => {  console.error(err.stack); // Logamos para nós mesmos  res.status(500).send('Erro interno do servidor');});


7. Uso inseguro de eval() e Function()

As funções eval() e new Function() executam uma string como código — isso é extremamente perigoso se a string contém dados do usuário.



// Perigoso! Nunca faça issoconst userInput = req.body.code;eval(userInput); // O atacante pode executar qualquer código


Alternativa:

Blogs

Book Recommendations