<h2>Injeção em Node.js</h2>
<p>A injeção é uma das vulnerabilidades mais críticas em aplicações web. Em Node.js, ocorre quando dados não validados são interpretados como código ou comando pelo servidor. A forma mais comum é a <strong>injeção SQL</strong>, mas também temos injeção de NoSQL, OS command injection e template injection.</p>
<p><strong>SQL Injection</strong> acontece quando concatenamos entrada do usuário diretamente em queries. No exemplo abaixo, um atacante pode manipular a lógica da consulta:</p>
<pre><code class="language-javascript">// ❌ VULNERÁVEL
const express = require('express');
const mysql = require('mysql');
const app = express();
app.get('/user/:id', (req, res) => {
const query = SELECT * FROM users WHERE id = ${req.params.id};
// Entrada: 1 OR 1=1 -- causa retorno de todos os usuários
connection.query(query, (err, results) => {
res.json(results);
});
});</code></pre>
<p>A defesa é usar <strong>prepared statements</strong> (queries parametrizadas), que separam código de dados:</p>
<pre><code class="language-javascript"></code></pre>
<p><strong>NoSQL Injection</strong> é igualmente perigosa. Em MongoDB, objetos JavaScript são interpretados como filtros:</p>
<pre><code class="language-javascript"></code></pre>
<p>Sempre valide e sanitize inputs usando bibliotecas como <code>joi</code>, <code>yup</code> ou <code>validator.js</code>.</p>
<h2>SSRF (Server-Side Request Forgery) e Path Traversal</h2>
<p><strong>SSRF</strong> ocorre quando sua aplicação faz requisições HTTP para URLs controladas pelo usuário, permitindo acesso a recursos internos. Um atacante pode acessar localhost, metadados AWS ou serviços internos:</p>
<pre><code class="language-javascript"></code></pre>
<p><strong>Path Traversal</strong> permite acesso a arquivos fora do diretório permitido usando <code>../</code>. Um atacante pode ler <code>/etc/passwd</code> ou arquivos privados:</p>
<pre><code class="language-javascript"></code></pre>
<p>Use <code>path.resolve()</code> para normalizar caminhos e sempre valide se o resultado está dentro do diretório esperado.</p>
<h2>Hardening e Boas Práticas</h2>
<p>Hardening significa endurecer sua aplicação contra múltiplos vetores de ataque. Comece com <strong>validação robusta</strong> de inputs, uso de variáveis de ambiente para secrets, e headers de segurança HTTP:</p>
<pre><code class="language-javascript">const express = require('express');
const helmet = require('helmet');
const rateLimit = require('express-rate-limit');
const validator = require('validator');
const app = express();
// Helmet adiciona headers de segurança (CSP, X-Frame-Options, etc)
app.use(helmet());
// Rate limiting previne força bruta
const limiter = rateLimit({
windowMs: 15 60 1000, // 15 minutos
max: 100 // máximo 100 requisições
});
app.use('/api/', limiter);
// Validação rigorosa
app.post('/register', (req, res) => {
const { email, password } = req.body;
if (!validator.isEmail(email)) {
return res.status(400).json({ error: 'Invalid email' });
}
if (!validator.isLength(password, { min: 12 })) {
return res.status(400).json({ error: 'Password too weak' });
}
// Hash de senha com bcrypt
const bcrypt = require('bcrypt');
const hashedPassword = bcrypt.hashSync(password, 10);
// Salve no banco...
res.json({ success: true });
});
// CORS restritivo
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', process.env.ALLOWED_ORIGINS);
res.header('Access-Control-Allow-Credentials', 'true');
next();
});</code></pre>
<p>Práticas adicionais essenciais: <strong>nunca exponha stack traces em produção</strong>, use logs estruturados, mantenha dependências atualizadas com <code>npm audit</code>, implemente autenticação forte (JWT com expiração curta), use HTTPS obrigatório, e considere WAF (Web Application Firewall) para ambientes críticos.</p>
<h2>Conclusão</h2>
<p>Os três pilares da segurança em Node.js são: <strong>validação rigorosa</strong> (sempre desconfie de inputs), <strong>separação de código e dados</strong> (prepared statements, whitelist), e <strong>hardening sistemático</strong> (headers, rate limiting, HTTPS). Vulnerabilidades como injeção, SSRF e path traversal continuam entre as mais exploradas porque desenvolvedores negligenciam essas fundações. Implemente essas práticas desde o design, não como patch posterior — segurança é construída, não adicionada.</p>
<h2>Referências</h2>
<ul>
<li><a href="https://owasp.org/www-project-top-ten/" target="_blank" rel="noopener noreferrer">OWASP Top 10 Web Application Security Risks</a></li>
<li><a href="https://nodejs.org/en/docs/guides/security/" target="_blank" rel="noopener noreferrer">Node.js Security Best Practices</a></li>
<li><a href="https://helmetjs.github.io/" target="_blank" rel="noopener noreferrer">Helmet.js Documentation</a></li>
<li><a href="https://github.com/nfriedly/express-rate-limit" target="_blank" rel="noopener noreferrer">Express Rate Limiting Middleware</a></li>
<li><a href="https://owasp.org/www-community/attacks/Path_Traversal" target="_blank" rel="noopener noreferrer">OWASP Path Traversal</a></li>
</ul>