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

\n\n

O desenvolvimento em JavaScript, especialmente no ambiente Node.js, abre amplas possibilidades para a criação de aplicações web modernas. No entanto, com o poder vem a responsabilidade. Ignorar questões de segurança pode levar a vazamento de dados, perdas financeiras e danos à reputação. Para desenvolvedores iniciantes, entender as principais ameaças é o primeiro passo para criar código seguro. Neste artigo, vamos analisar as 10 principais vulnerabilidades do JavaScript (Node.js) com base na lista OWASP, com exemplos de código e dicas práticas de proteção.

\n\n

1. Cross-Site Scripting (XSS)

\n

XSS é um dos ataques mais comuns. O invasor insere um script malicioso em uma página web, que é executado no navegador da vítima. No Node.js, isso geralmente ocorre através da saída de dados sem escape.

\n\n

Exemplo de código vulnerável (Express):

\n
app.get('/user/:name', (req, res) => {\n  res.send('<h1>Olá, ' + req.params.name + '</h1>');\n});\n
\n\n

Como se proteger: Use mecanismos de template com escape automático (por exemplo, Handlebars, EJS) ou bibliotecas como helmet. Nunca insira entrada do usuário diretamente no HTML.

\n\n
app.get('/user/:name', (req, res) => {\n  const safeName = encodeURIComponent(req.params.name);\n  res.send(`<h1>Olá, ${safeName}</h1>`);\n});\n
\n\n

2. Injeção de SQL

\n

Se sua aplicação usa um banco de dados SQL (por exemplo, PostgreSQL ou MySQL), o tratamento incorreto de consultas pode levar à execução de código SQL arbitrário.

\n\n

Código vulnerável:

\n
const query = `SELECT * FROM users WHERE email = '${userInput}'`;\ndb.query(query, callback);\n
\n\n

Solução: Sempre use consultas parametrizadas ou ORM (por exemplo, Sequelize, Prisma).

\n\n
const query = 'SELECT * FROM users WHERE email = $1';\ndb.query(query, [userInput], callback);\n
\n\n

3. Cross-Site Request Forgery (CSRF)

\n

O ataque CSRF força o usuário a executar uma ação indesejada em um site onde ele está autenticado. Por exemplo, transferir dinheiro ou alterar a senha.

\n\n

Proteção: Use tokens CSRF. No Express, a biblioteca csurf é popular (obsoleta, mas substituída por csrf-csrf ou soluções integradas de frameworks).

\n\n
const csrf = require('csrf-csrf');\nconst { generateToken } = csrf();\n\napp.post('/transfer', (req, res) => {\n  const token = req.body._csrf;\n  if (!validateToken(token)) {\n    return res.status(403).send('Ataque CSRF');\n  }\n  // Executar transferência\n});\n
\n\n

4. Dependências Inseguras

\n

Aplicações Node.js usam milhares de pacotes do npm. Dependências desatualizadas ou vulneráveis são uma causa comum de invasões.

\n\n

Recomendações:

\n
    \n
  • Execute regularmente npm audit para verificar vulnerabilidades.
  • \n
  • Use snyk ou Dependabot para atualizações automáticas.
  • \n
  • Remova pacotes não utilizados.
  • \n
\n\n

5. Autenticação e Gerenciamento de Sessões Inseguros

\n

Senhas fracas, ausência de limite de tentativas de login, armazenamento incorreto de tokens de sessão — tudo isso leva à comprometimento de contas.

\n\n

Melhores práticas:

\n
    \n
  • Armazene senhas com hash (bcrypt, argon2).
  • \n
  • Use JWT com curto tempo de vida e refresh tokens.
  • \n
  • Defina um limite de tentativas de login (rate limiting).
  • \n
\n\n
const bcrypt = require('bcrypt');\nconst saltRounds = 10;\n\n// Registro\nconst hash = await bcrypt.hash(password, saltRounds);\n\n// Login\nconst match = await bcrypt.compare(inputPassword, hash);\n
\n\n

6. Falhas no Controle de Acesso

\n

Usu

Blogs

Book Recommendations