Aula 12 – Segurança em Aplicações Web (OWASP Top 10) 🕸️
Nesta aula vamos sair da teoria criptográfica e entrar no dia a dia de quem constrói aplicações web: as vulnerabilidades mais exploradas do mundo, catalogadas pelo OWASP Top 10.
🏛️ O que é a OWASP?
A OWASP (Open Worldwide Application Security Project) é uma organização sem fins lucrativos que mantém, entre outros recursos, uma lista atualizada periodicamente das vulnerabilidades web mais críticas e comuns — referência obrigatória para qualquer desenvolvedor.
🔟 As Categorias do OWASP Top 10
| # | Categoria | O que é |
|---|---|---|
| 1 | Broken Access Control | Falhas que permitem acessar recursos sem permissão adequada |
| 2 | Cryptographic Failures | Uso incorreto ou ausência de criptografia em dados sensíveis |
| 3 | Injection | Inserir código malicioso via entrada do usuário (SQL, comandos, etc.) |
| 4 | Insecure Design | Falhas de segurança na arquitetura, não só na implementação |
| 5 | Security Misconfiguration | Configurações padrão inseguras, permissões excessivas |
| 6 | Vulnerable Components | Usar bibliotecas/dependências desatualizadas com falhas conhecidas |
| 7 | Auth Failures | Falhas em autenticação e gerenciamento de sessão |
| 8 | Software/Data Integrity Failures | Confiar em atualizações/dados sem verificar integridade |
| 9 | Logging Failures | Falta de logs adequados para detectar e investigar ataques |
| 10 | SSRF | Servidor é enganado para fazer requisições a locais não autorizados |
💉 Foco Prático: SQL Injection
A vulnerabilidade mais didática e ainda muito comum. Acontece quando a entrada do usuário é concatenada diretamente em uma consulta SQL.
# ❌ VULNERÁVEL - concatenação direta
query = f"SELECT * FROM usuarios WHERE nome = '{nome_usuario}'"
# Se nome_usuario for: ' OR '1'='1
# A query vira: SELECT * FROM usuarios WHERE nome = '' OR '1'='1'
# Isso retorna TODOS os usuários!
# ✅ SEGURO - consulta parametrizada (prepared statement)
cursor.execute("SELECT * FROM usuarios WHERE nome = %s", (nome_usuario,))
graph TD
A["Entrada do usuário"] --> B{"Concatenada direto na query?"}
B -- Sim --> C["❌ SQL Injection possível"]
B -- Não, usa prepared statement --> D["✅ Entrada tratada como dado, nunca como código"] 🖼️ Foco Prático: XSS (Cross-Site Scripting)
Ocorre quando dados fornecidos pelo usuário são exibidos na página sem escapar caracteres especiais de HTML, permitindo injetar scripts.
<!-- Comentário de usuário exibido sem tratamento -->
<div>Comentário: <script>roubarCookies()</script></div>
Regra de ouro contra XSS
Nunca confie em dados do usuário. Sempre escape (ou use frameworks que escapam automaticamente, como React/Vue) qualquer conteúdo dinâmico antes de renderizá-lo como HTML.
💻 Testando Cabeçalhos de Segurança
📝 Exercícios de Fixação
- Básico: O que significa a sigla OWASP e qual o objetivo do OWASP Top 10?
- Básico: Explique com suas palavras como funciona um ataque de SQL Injection.
- Intermediário: Por que consultas parametrizadas (prepared statements) resolvem o problema de SQL Injection?
- Intermediário: Dê um exemplo prático de onde um XSS poderia ser injetado em uma rede social (ex: campo de comentário, nome de perfil).
- Desafio: Pesquise a diferença entre XSS Refletido, Armazenado e Baseado em DOM.
🚀 Mini-Projeto: Caça-Vulnerabilidades
Objetivo: Analisar um trecho de código (fornecido pelo professor ou pesquisado por você) e identificar vulnerabilidades do OWASP Top 10.
- Encontre (ou peça) um trecho de código com uma consulta SQL montada por concatenação de strings.
- Identifique a vulnerabilidade e explique como ela seria explorada.
- Reescreva o código de forma segura, usando prepared statements.
- Repita o exercício com um trecho que renderiza entrada de usuário direto no HTML (risco de XSS).