A criptografia do transporte: HTTPS/TLS
HTTPS é HTTP sobre TLS (Transport Layer Security). Criptografa o tráfego entre cliente e servidor, garante a integridade (ninguém altera os dados em trânsito) e a autenticidade (o certificado prova que você está falando com o servidor real, e não com um atacante no meio). Em produção, tudo passa por HTTPS: as senhas, os tokens de sessão e os cookies viajam em texto puro sem ele.
Reforce com o cabeçalho HSTS (Strict-Transport-Security), que obriga o
navegador a sempre usar HTTPS para o seu domínio.
CORS: quem pode chamar a sua API
O navegador aplica a política de mesma origem (same-origin policy): por
padrão, uma página de a.com não pode ler respostas de uma API em b.com.
CORS (Cross-Origin Resource Sharing) é o mecanismo pelo qual o servidor
autoriza explicitamente origens específicas com cabeçalhos como
Access-Control-Allow-Origin. Não use * com credenciais: liste apenas as
origens confiáveis.
CSP: Content Security Policy
O cabeçalho Content-Security-Policy declara de quais fontes o
navegador pode carregar scripts, estilos e imagens. É a defesa mais forte contra
XSS: mesmo que um atacante injete <script>, o navegador se recusa a
executá-lo se ele não vier de uma fonte permitida.
Content-Security-Policy: default-src 'self'; script-src 'self'
Cabeçalhos de segurança: helmet
No Express, helmet é um middleware que define de uma só vez um conjunto de
cabeçalhos de segurança sensatos (CSP, HSTS, X-Content-Type-Options,
X-Frame-Options contra clickjacking, etc.):
const helmet = require("helmet");
app.use(helmet());
OWASP Top: os riscos clássicos
O OWASP Top 10 lista os riscos web mais comuns. Três imprescindíveis:
Injeção de SQL. Concatenar entradas do usuário dentro de uma consulta deixa executar SQL arbitrário. A defesa é usar consultas parametrizadas (prepared statements): os dados viajam separados do texto SQL e nunca são interpretados como código.
// ❌ vulnerável: concatena a entrada db.query("SELECT * FROM users WHERE email = '" + email + "'"); // ✅ parametrizada: o driver escapa o valor db.query("SELECT * FROM users WHERE email = $1", [email]);XSS (Cross-Site Scripting). O atacante faz com que o navegador da vítima execute o JavaScript dele injetando-o em uma página. Previne-se escapando (convertendo em entidades HTML) qualquer dado do usuário antes de renderizá-lo, e reforçando com CSP.
CSRF (Cross-Site Request Forgery). Um site malicioso faz com que o navegador da vítima, já autenticada, envie uma requisição para a sua API aproveitando os cookies dela. Mitiga-se com tokens CSRF e cookies
SameSite.
Sanitizar e escapar entradas
Regra de ouro: valide a entrada (rejeite o que não corresponde ao esperado), sanitize (remova o que é perigoso) e escape na saída conforme o contexto (HTML, SQL, shell). Escapar na renderização é o que neutraliza o XSS.
Gestão de segredos e varredura de dependências
As chaves, senhas e tokens nunca são escritos no código nem enviados
ao repositório: vão em variáveis de ambiente ou em um gerenciador de segredos
(Vault, AWS Secrets Manager). E como a maior parte do seu código são
dependências de terceiros, faça a varredura delas em busca de vulnerabilidades
conhecidas com npm audit (e ferramentas como Dependabot ou Snyk) de forma
contínua.