Segurança de Aplicações JavaScript: Top 10 Vulnerabilidades para Iniciantes
\n\nO 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\n1. Cross-Site Scripting (XSS)
\nXSS é 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\nExemplo de código vulnerável (Express):
\napp.get('/user/:name', (req, res) => {\n res.send('<h1>Olá, ' + req.params.name + '</h1>');\n});\n\n\nComo 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.
app.get('/user/:name', (req, res) => {\n const safeName = encodeURIComponent(req.params.name);\n res.send(`<h1>Olá, ${safeName}</h1>`);\n});\n\n\n2. Injeção de SQL
\nSe 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\nCódigo vulnerável:
\nconst query = `SELECT * FROM users WHERE email = '${userInput}'`;\ndb.query(query, callback);\n\n\nSolução: Sempre use consultas parametrizadas ou ORM (por exemplo, Sequelize, Prisma).
\n\nconst query = 'SELECT * FROM users WHERE email = $1';\ndb.query(query, [userInput], callback);\n\n\n3. Cross-Site Request Forgery (CSRF)
\nO 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\nProteção: Use tokens CSRF. No Express, a biblioteca csurf é popular (obsoleta, mas substituída por csrf-csrf ou soluções integradas de frameworks).
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\n4. Dependências Inseguras
\nAplicações Node.js usam milhares de pacotes do npm. Dependências desatualizadas ou vulneráveis são uma causa comum de invasões.
\n\nRecomendações:
\n- \n
- Execute regularmente
npm auditpara verificar vulnerabilidades. \n - Use
snykouDependabotpara atualizações automáticas. \n - Remova pacotes não utilizados. \n
5. Autenticação e Gerenciamento de Sessões Inseguros
\nSenhas fracas, ausência de limite de tentativas de login, armazenamento incorreto de tokens de sessão — tudo isso leva à comprometimento de contas.
\n\nMelhores 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
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\n6. Falhas no Controle de Acesso
\nUsu