Um guia rápido e implementável das 10 categorias do OWASP Top 10 na versão de 2026, com o padrão vulnerável e o padrão seguro lado a lado, em PHP 8, Node 20 e Python 3.12. Sem teoria — código.
O OWASP Top 10 deixou de ser um cartaz de conscientização e virou o item de check no board de qualquer empresa que passa por due-diligence. Este guia dispensa a introdução e vai direto ao código: para cada uma das 10 categorias, o padrão vulnerável, o padrão seguro, e o que muda entre PHP, Node e Python.
A01 — Broken Access Control
Vulnerável (Node):
app.get('/api/orders/:id', (req, res) => {
db.orders.findById(req.params.id).then(order => res.json(order));
});
Qualquer usuário logado busca qualquer pedido.
Seguro:
app.get('/api/orders/:id', async (req, res) => {
const order = await db.orders.findOne({ id: req.params.id, user_id: req.user.id });
if (!order) return res.status(404).end();
res.json(order);
});
A cláusula de propriedade é obrigatória em toda query indexada por ID.
A02 — Cryptographic Failures
Vulnerável (PHP):
$hash = md5($password);
MD5 não é hash de senha. É praticamente texto puro em 2026.
Seguro:
$hash = password_hash($password, PASSWORD_ARGON2ID);
if (password_verify($input, $hash)) { /* ok */ }
Argon2id é o default. bcrypt ainda é aceitável, mas Argon2id venceu.
A03 — Injection
Vulnerável (Python):
cursor.execute(f"SELECT * FROM users WHERE email='{email}'")
Seguro:
cursor.execute("SELECT * FROM users WHERE email = %s", (email,))
Regra sem exceção: nunca concatene input do usuário na string do SQL.
A04 — Insecure Design
Menos sobre código, mais sobre arquitetura. O padrão que a Varredura mais encontra: funcionalidades sensíveis sem workflow de aprovação. Exemplo: mudar senha do usuário só pede a senha atual, mas mudar e-mail não pede nem manda confirmação. Refactor: adicione um passo de reauth em toda mudança sensível.
A05 — Security Misconfiguration
Lista de sinais que a Varredura marca automaticamente:
.envno diretório públicophpinfo.phpesquecido- Debug/stack trace em produção (
APP_DEBUG=true) X-Powered-Byheader revelando versão exata do PHP/Node- Headers de segurança ausentes: CSP, HSTS, X-Content-Type-Options
Mínimo em qualquer stack em 2026:
Content-Security-Policy: default-src 'self'
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
X-Content-Type-Options: nosniff
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=()
A06 — Vulnerable and Outdated Components
Detectar:
- Node:
npm audit --production - Python:
pip-audit - PHP:
composer audit
Rodar no CI, bloquear merge em severity high+. Duas exceções permitidas por semestre, cada uma justificada no PR.
A07 — Identification and Authentication Failures
Padrões mínimos hoje:
- Rate limit em
/login,/signup,/forgot-password: 5 tentativas por 15 min por IP + por conta. - Sessão com rotação de token após login (previne fixation).
- MFA obrigatório para admin/root; opcional-mas-recomendado para todos.
- Reset de senha nunca revela se o, osámail existe. Sempre responde "se existe, mandamos link".
A08 — Software and Data Integrity Failures
Não confie em pacote sem lockfile. Não rode curl | sh de fonte não verificada. Se seu deploy pipeline aceita qualquer branch, aceita qualquer commit — e qualquer commit aceita qualquer atacante com acesso ao repo.
Padrão mínimo:
- Lockfile obrigatório no repositório
- Deploy só de tags assinadas (ou pelo menos de branches protegidas)
- Verificação de checksum em dependências binárias
A09 — Security Logging and Monitoring Failures
Log de login vitorioso, log de login falhado, log de mudança de senha, log de mudança de permissão, log de export de dados. Sem PII no log. Retenção mínima de 90 dias em ambiente separado do app.
PHP + Monolog:
$logger->info('auth.login.success', ['user_id' => $userId, 'ip' => $ip]);
Nunca $logger->info('login', $_POST). Aquilo vai virar senha em texto puro no log.
A10 — Server-Side Request Forgery (SSRF)
Coberto em detalhe em Anatomia de uma SSRF. Resumo: use SEMPRE um wrapper HTTP centralizado que resolve DNS e valida contra allowlist de faixas de IP; nunca deixe o cliente HTTP seguir redirect sem revalidar.
Como usar essa lista
Não como cartaz. Como matriz de PR: toda mudança nova é revisada contra os 10 pontos. Toda vulnerabilidade encontrada em produção vira teste de regressão automatizado. Toda categoria com incidente ganha alarme dedicado no observability.
A Varredura testa as 10 categorias contra sua aplicação em produção sem tocar em código-fonte. Rode agora.
Sua app em produção passa por essa análise?
Rode uma varredura autônoma em ~60 segundos. Sem cadastro.