A segurança de aplicações web é um dos pilares da segurança da informação na era digital. Com o aumento de ataques cibernéticos, é fundamental que desenvolvedores e profissionais de segurança compreendam as principais vulnerabilidades que afetam sistemas web. Esta aula explora os riscos mais críticos, baseados no OWASP Top 10, e fornece orientações práticas para mitigá-los.

O OWASP (Open Web Application Security Project) é uma comunidade que publica periodicamente um ranking das vulnerabilidades mais comuns e perigosas em aplicações web. Conhecer e entender essas vulnerabilidades é o primeiro passo para construir aplicações mais seguras.

OWASP Top 10

O OWASP Top 10 é um documento que lista os dez riscos de segurança mais críticos para aplicações web. Ele é atualizado periodicamente (última versão 2021) e serve como referência para equipes de desenvolvimento e segurança. A lista inclui vulnerabilidades como injeção, quebra de autenticação, exposição de dados sensíveis, entre outras.

Cada item do Top 10 descreve o risco, seu impacto potencial e como preveni-lo. Por exemplo, a categoria "Injeção" inclui SQL, NoSQL e injeção de comandos. O objetivo é conscientizar sobre as práticas de codificação segura e orientar testes de segurança.

Exemplo de código que demonstra uma vulnerabilidade de injeção SQL (não seguro):

String query = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'";

O código acima é vulnerável porque concatena diretamente a entrada do usuário na consulta. Um invasor pode fornecer username = ' OR '1'='1 para contornar a autenticação.

Injeção

Injeção ocorre quando dados não confiáveis são enviados a um interpretador como parte de um comando ou consulta. Os tipos mais comuns são SQL, NoSQL, OS command e LDAP injection. O impacto pode ser grave: desde acesso não autorizado a dados até execução remota de comandos.

Para prevenir injeção, a principal técnica é usar consultas parametrizadas (prepared statements) ou ORM (Object-Relational Mapping) que escapam automaticamente os dados. Nunca confie na entrada do usuário. Exemplo seguro em Java com PreparedStatement:

String query = "SELECT * FROM users WHERE username = ? AND password = ?";
PreparedStatement stmt = connection.prepareStatement(query);
stmt.setString(1, username);
stmt.setString(2, password);
ResultSet rs = stmt.executeQuery();

Além disso, valide e sanitize todas as entradas, use listas brancas (whitelist) e evite concatenar strings para formar comandos.

Broken Access Control

Controle de acesso quebrado ocorre quando os mecanismos de autorização não são implementados corretamente, permitindo que usuários acessem recursos ou executem ações além de suas permissões. Exemplos: acesso a dados de outros usuários, escalação de privilégios, ou bypass de restrições.

Para mitigar, adote o princípio do menor privilégio: cada usuário deve ter apenas as permissões necessárias. Implemente verificações de autorização em cada requisição, tanto no frontend quanto no backend. Nunca confie apenas na interface do usuário; valide no servidor. Exemplo de código vulnerável:

// Código vulnerável: não verifica se o usuário logado é o dono do recurso
app.get('/user/:id', (req, res) => {
    const user = db.findUserById(req.params.id);
    res.json(user);
});

Versão corrigida:

app.get('/user/:id', (req, res) => {
    if (req.user.id !== req.params.id && !req.user.isAdmin) {
        return res.status(403).send('Acesso negado');
    }
    const user = db.findUserById(req.params.id);
    res.json(user);
});

Configuração Insegura

Configurações inseguras abrangem desde servidores web mal configurados até permissões excessivas em arquivos e diretórios, uso de bibliotecas com vulnerabilidades conhecidas, ou ativação de funcionalidades desnecessárias. Essas falhas podem expor informações sensíveis ou permitir ataques.

Para evitar, siga boas práticas: desative serviços e portas não utilizados, remova informações de versão de cabeçalhos HTTP, configure corretamente permissões de arquivos, e mantenha softwares atualizados. Use ferramentas como scanners de configuração (ex: OWASP ZAP) para identificar problemas. Exemplo de configuração insegura no Apache:

<Directory /var/www/html>
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

O Options Indexes permite listagem de diretórios, o que pode expor arquivos. Remova ou desabilite essa opção.

Referências

Exercícios

  1. Explique o que é o OWASP Top 10 e qual sua importância para o desenvolvimento seguro.
  2. ✓ Resposta: O OWASP Top 10 é uma lista dos dez riscos de segurança mais críticos para aplicações web, publicada pela comunidade OWASP. Sua importância reside em fornecer uma referência atualizada para que desenvolvedores e profissionais de segurança priorizem a mitigação das vulnerabilidades mais comuns e perigosas, orientando práticas de codificação segura, testes e auditorias.
  3. Dê um exemplo de código vulnerável a injeção SQL e apresente a correção usando prepared statements.
  4. ✓ Resposta: Código vulnerável:
    String query = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'";
    Correção com PreparedStatement:
    String query = "SELECT * FROM users WHERE username = ? AND password = ?";
    PreparedStatement stmt = connection.prepareStatement(query);
    stmt.setString(1, username);
    stmt.setString(2, password);
    ResultSet rs = stmt.executeQuery();
  5. O que é broken access control e cite duas medidas para preveni-lo.
  6. ✓ Resposta: Broken access control é uma vulnerabilidade onde usuários podem acessar recursos ou executar ações além de suas permissões. Medidas de prevenção: 1) Implementar verificações de autorização no servidor para cada requisição; 2) Adotar o princípio do menor privilégio, concedendo apenas permissões necessárias.
  7. Cite três exemplos de configuração insegura em aplicações web.
  8. ✓ Resposta: 1) Diretórios com listagem habilitada (Options Indexes); 2) Uso de senhas padrão ou fracas; 3) Exposição de informações de versão em cabeçalhos HTTP (ex: Server: Apache/2.4.1).
  9. Qual a diferença entre autenticação e autorização? Dê um exemplo de falha em cada.
  10. ✓ Resposta: Autenticação verifica a identidade do usuário (quem é você). Exemplo de falha: permitir login com senha fraca ou sem validação de força bruta. Autorização verifica as permissões (o que você pode fazer). Exemplo de falha: um usuário comum acessar uma página de administrador sem verificação de papel (role).

Boas práticas finais: Sempre valide entradas, use HTTPS, implemente logging e monitoramento, realize testes de segurança regulares (como análise estática e dinâmica) e mantenha-se atualizado sobre novas vulnerabilidades.