Segurança de aplicações web: 10 boas práticas para 2024

Segurança de aplicações web: 10 boas práticas para 2024

A segurança das aplicações web tornou-se um assunto crítico para qualquer empresa presente online. Os ciberataques multiplicam-se e ficam mais sofisticados, pondo em risco os dados sensíveis e a reputação das organizações. Este artigo mostra-te as melhores práticas para proteger de forma eficaz as tuas aplicações web contra as ameaças atuais e futuras.

Perceber as principais ameaças

Os ataques mais comuns

Antes de saltar para as soluções, é essencial perceber os principais tipos de ataque que ameaçam as aplicações web:

  1. Injeção SQL: esta técnica consiste em inserir código malicioso nas consultas SQL para manipular a base de dados.
  2. Cross-Site Scripting (XSS): os atacantes injetam scripts maliciosos em páginas web consultadas por outros utilizadores.
  3. Ataques por força bruta: os atacantes tentam adivinhar as credenciais experimentando um sem-número de combinações.

A evolução das ameaças em 2024

Os cibercriminosos adaptam constantemente as suas técnicas. Em 2024 assiste-se a um recrudescimento dos ataques dirigidos e a um uso crescente da inteligência artificial para automatizar e afinar as tentativas de intrusão.

Os fundamentos da segurança das aplicações web

Implementar uma autenticação robusta

Uma autenticação sólida é a primeira linha de defesa contra os acessos não autorizados.

  • Hash seguro das palavras-passe: usa algoritmos de hash modernos como o bcrypt ou o Argon2 para guardar as palavras-passe.

Exemplo em PHP com password_hash() e password_verify():

php
// Hash da palavra-passe no registo
$password = $_POST['password'];
$hashedPassword = password_hash($password, PASSWORD_ARGON2ID);

// Guarda a $hashedPassword na base de dados

// Verificação da palavra-passe no início de sessão
$storedHash = // Vai buscar o hash guardado na base de dados
if (password_verify($_POST['password'], $storedHash)) {
    // Palavra-passe correta
} else {
    // Palavra-passe incorreta
}
  • Autenticação multifator (2FA/MFA): acrescenta uma camada extra de segurança exigindo várias formas de identificação.

Gestão segura das sessões

Monta mecanismos para proteger as sessões dos utilizadores:

  • Gera identificadores de sessão aleatórios e complexos.
  • Impõe a expiração das sessões ao fim de um período de inatividade.
  • Usa cookies seguros com os atributos HttpOnly e Secure
php
// Configura as opções de sessão seguras
ini_set('session.cookie_httponly', 1);
ini_set('session.use_only_cookies', 1);
ini_set('session.cookie_secure', 1);

// Gera um novo ID de sessão a cada início de sessão
session_regenerate_id(true);

// Define um tempo de vida para a sessão
ini_set('session.gc_maxlifetime', 3600); // 1 hora
  • Autenticação multifator (2FA/MFA): acrescenta uma camada extra de segurança exigindo várias formas de identificação.

Validar e limpar os dados introduzidos pelo utilizador

Todos os dados que vêm do utilizador devem ser tratados como potencialmente perigosos:

  • Valida tudo rigorosamente do lado do servidor.
  • Usa listas brancas para filtrar os caracteres autorizados.
  • Faz o escape correto dos dados antes de os inserir em consultas SQL ou em código HTML.
php
// Exemplo de validação e limpeza de um endereço de email
$email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    // O email não é válido
}

// Exemplo de proteção contra a injeção SQL com consultas preparadas
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username");
$stmt->execute(['username' => $username]);
$user = $stmt->fetch();

Proteção dos dados sensíveis

Cifrar os dados em trânsito e em repouso

A cifragem é essencial para proteger as informações sensíveis:

  • Usa TLS 1.3 para proteger as comunicações entre o cliente e o servidor.
  • Cifra os dados sensíveis guardados na base de dados.
php
// Cifragem
$plaintext = "Données sensibles à chiffrer";
$cipher = "aes-256-cbc";
$key = openssl_random_pseudo_bytes(32);
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($cipher));

$encrypted = openssl_encrypt($plaintext, $cipher, $key, 0, $iv);

// Decifragem
$decrypted = openssl_decrypt($encrypted, $cipher, $key, 0, $iv);

Passar o site para HTTPS/SSL

O HTTPS já não é uma opção, é uma necessidade:

  • Obtém um certificado SSL/TLS válido junto de uma autoridade de certificação reconhecida.
  • Configura o servidor para redirecionar automaticamente todo o tráfego HTTP para HTTPS.
.htaccess
php
# Rediriger HTTP vers HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Gestão segura das APIs

As APIs são muitas vezes pontos de entrada críticos:

  • Implementa uma autenticação forte no acesso às APIs.
  • Limita o número de pedidos para evitar abusos.
  • Usa tokens JWT (JSON Web Tokens) para uma gestão segura das sessões de API.
    • Estabelece um processo sistemático para aplicar as correções de segurança.
    • Subscreve os boletins de segurança dos fornecedores do software que usas.

Formação e sensibilização para a segurança

      • Organiza sessões de formação regulares sobre as técnicas de segurança mais recentes.
      • Educa os utilizadores nas boas práticas de segurança (criar palavras-passe fortes, detetar phishing, etc.).

    Conformidade e normas de segurança

        • Garante que a tua aplicação web cumpre a regulamentação em vigor (RGPD, PCI DSS, etc.).
        • Usa o Top 10 da OWASP como referência para identificar e corrigir as vulnerabilidades mais críticas.

      Conclusão

      Proteger uma aplicação web é um processo contínuo, que exige vigilância constante. Ao adotares estas boas práticas, reforças bastante a defesa das tuas aplicações contra as ciberameaças de hoje e de amanhã.

        • Faz testes de intrusão pelo menos uma vez por ano ou depois de cada alteração de fundo.
        • Coloca à frente um firewall aplicacional web (WAF) para bloquear muitos dos ataques mais comuns.
        • Configura alertas para as atividades suspeitas.
        • Guarda os logs durante tempo suficiente para permitir análises forenses.

      Gestão de vulnerabilidades e atualizações

          • Estabelece um processo sistemático para aplicar as correções de segurança.
          • Subscreve os boletins de segurança dos fornecedores do software que usas.

        Formação e sensibilização para a segurança

            • Organiza sessões de formação regulares sobre as técnicas de segurança mais recentes.
            • Educa os utilizadores nas boas práticas de segurança (criar palavras-passe fortes, detetar phishing, etc.).

          Conformidade e normas de segurança

              • Garante que a tua aplicação web cumpre a regulamentação em vigor (RGPD, PCI DSS, etc.).
              • Usa o Top 10 da OWASP como referência para identificar e corrigir as vulnerabilidades mais críticas.

            Conclusão

            Proteger uma aplicação web é um processo contínuo, que exige vigilância constante. Ao adotares estas boas práticas, reforças bastante a defesa das tuas aplicações contra as ciberameaças de hoje e de amanhã.

              • Forma a tua equipa em técnicas de programação segura.
              • Usa frameworks e bibliotecas com boa reputação em matéria de segurança.
              • Faz revisões de código regulares centradas na segurança.
              • Mantém um inventário atualizado de todas as dependências.
              • Usa ferramentas automáticas para detetar vulnerabilidades nas bibliotecas de terceiros.
              • Aplica o princípio da defesa em profundidade, protegendo cada camada da infraestrutura.

            Testes e monitorização contínua

                • Faz testes de intrusão pelo menos uma vez por ano ou depois de cada alteração de fundo.
                • Coloca à frente um firewall aplicacional web (WAF) para bloquear muitos dos ataques mais comuns.
                • Configura alertas para as atividades suspeitas.
                • Guarda os logs durante tempo suficiente para permitir análises forenses.

              Gestão de vulnerabilidades e atualizações

                  • Estabelece um processo sistemático para aplicar as correções de segurança.
                  • Subscreve os boletins de segurança dos fornecedores do software que usas.

                Formação e sensibilização para a segurança

                    • Organiza sessões de formação regulares sobre as técnicas de segurança mais recentes.
                    • Educa os utilizadores nas boas práticas de segurança (criar palavras-passe fortes, detetar phishing, etc.).

                  Conformidade e normas de segurança

                      • Garante que a tua aplicação web cumpre a regulamentação em vigor (RGPD, PCI DSS, etc.).
                      • Usa o Top 10 da OWASP como referência para identificar e corrigir as vulnerabilidades mais críticas.

                    Conclusão

                    Proteger uma aplicação web é um processo contínuo, que exige vigilância constante. Ao adotares estas boas práticas, reforças bastante a defesa das tuas aplicações contra as ciberameaças de hoje e de amanhã.

                    php
                    function hasPermission($userId, $action) {
                        $userRole = getUserRole($userId); // Função para obter o papel do utilizador
                        $permissions = [
                            'admin' => ['read', 'write', 'delete'],
                            'editor' => ['read', 'write'],
                            'viewer' => ['read']
                        ];
                    
                    return in_array($action, $permissions[$userRole] ?? []);
                    }
                    
                    // Utilização
                    if (hasPermission($userId, 'write')) {
                        // Autorizar a ação de escrita
                    } else {
                        // Recusar o acesso
                    }

                    Segurança do código e da infraestrutura

                        • Forma a tua equipa em técnicas de programação segura.
                        • Usa frameworks e bibliotecas com boa reputação em matéria de segurança.
                        • Faz revisões de código regulares centradas na segurança.
                        • Mantém um inventário atualizado de todas as dependências.
                        • Usa ferramentas automáticas para detetar vulnerabilidades nas bibliotecas de terceiros.
                        • Aplica o princípio da defesa em profundidade, protegendo cada camada da infraestrutura.

                      Testes e monitorização contínua

                          • Faz testes de intrusão pelo menos uma vez por ano ou depois de cada alteração de fundo.
                          • Coloca à frente um firewall aplicacional web (WAF) para bloquear muitos dos ataques mais comuns.
                          • Configura alertas para as atividades suspeitas.
                          • Guarda os logs durante tempo suficiente para permitir análises forenses.

                        Gestão de vulnerabilidades e atualizações

                            • Estabelece um processo sistemático para aplicar as correções de segurança.
                            • Subscreve os boletins de segurança dos fornecedores do software que usas.

                          Formação e sensibilização para a segurança

                              • Organiza sessões de formação regulares sobre as técnicas de segurança mais recentes.
                              • Educa os utilizadores nas boas práticas de segurança (criar palavras-passe fortes, detetar phishing, etc.).

                            Conformidade e normas de segurança

                                • Garante que a tua aplicação web cumpre a regulamentação em vigor (RGPD, PCI DSS, etc.).
                                • Usa o Top 10 da OWASP como referência para identificar e corrigir as vulnerabilidades mais críticas.

                              Conclusão

                              Proteger uma aplicação web é um processo contínuo, que exige vigilância constante. Ao adotares estas boas práticas, reforças bastante a defesa das tuas aplicações contra as ciberameaças de hoje e de amanhã.

                                Controlo de acessos e autorizações

                                Princípio do menor privilégio

                                Dá a cada utilizador ou processo apenas os direitos necessários para cumprir as suas tarefas específicas.

                                Montar uma política de controlo de acessos eficaz

                                Exemplo simples de controlo de acessos baseado em papéis:

                                php
                                function hasPermission($userId, $action) {
                                    $userRole = getUserRole($userId); // Função para obter o papel do utilizador
                                    $permissions = [
                                        'admin' => ['read', 'write', 'delete'],
                                        'editor' => ['read', 'write'],
                                        'viewer' => ['read']
                                    ];
                                
                                return in_array($action, $permissions[$userRole] ?? []);
                                }
                                
                                // Utilização
                                if (hasPermission($userId, 'write')) {
                                    // Autorizar a ação de escrita
                                } else {
                                    // Recusar o acesso
                                }

                                Segurança do código e da infraestrutura

                                    • Forma a tua equipa em técnicas de programação segura.
                                    • Usa frameworks e bibliotecas com boa reputação em matéria de segurança.
                                    • Faz revisões de código regulares centradas na segurança.
                                    • Mantém um inventário atualizado de todas as dependências.
                                    • Usa ferramentas automáticas para detetar vulnerabilidades nas bibliotecas de terceiros.
                                    • Aplica o princípio da defesa em profundidade, protegendo cada camada da infraestrutura.

                                  Testes e monitorização contínua

                                      • Faz testes de intrusão pelo menos uma vez por ano ou depois de cada alteração de fundo.
                                      • Coloca à frente um firewall aplicacional web (WAF) para bloquear muitos dos ataques mais comuns.
                                      • Configura alertas para as atividades suspeitas.
                                      • Guarda os logs durante tempo suficiente para permitir análises forenses.

                                    Gestão de vulnerabilidades e atualizações

                                        • Estabelece um processo sistemático para aplicar as correções de segurança.
                                        • Subscreve os boletins de segurança dos fornecedores do software que usas.

                                      Formação e sensibilização para a segurança

                                          • Organiza sessões de formação regulares sobre as técnicas de segurança mais recentes.
                                          • Educa os utilizadores nas boas práticas de segurança (criar palavras-passe fortes, detetar phishing, etc.).

                                        Conformidade e normas de segurança

                                            • Garante que a tua aplicação web cumpre a regulamentação em vigor (RGPD, PCI DSS, etc.).
                                            • Usa o Top 10 da OWASP como referência para identificar e corrigir as vulnerabilidades mais críticas.

                                          Conclusão

                                          Proteger uma aplicação web é um processo contínuo, que exige vigilância constante. Ao adotares estas boas práticas, reforças bastante a defesa das tuas aplicações contra as ciberameaças de hoje e de amanhã.

                                          php
                                          function generateToken($userId) {
                                              $payload = [
                                                  'user_id' => $userId,
                                                  'exp' => time() + 3600 // Expira daqui a 1 hora
                                              ];
                                              return jwt_encode($payload, 'votre_clé_secrète');
                                          }
                                          
                                          function verifyToken($token) {
                                              try {
                                                  $payload = jwt_decode($token, 'votre_clé_secrète');
                                                  if ($payload->exp < time()) {
                                                      return false; // Token expirado
                                                  }
                                                  return $payload->user_id;
                                              } catch (Exception $e) {
                                                  return false; // Token inválido
                                              }
                                          }
                                          
                                          // Utilização numa rota de API
                                          $token = getBearerToken(); // Função para extrair o token do header
                                          $userId = verifyToken($token);
                                          if ($userId === false) {
                                              http_response_code(401);
                                              echo json_encode(['error' => 'Unauthorized']);
                                              exit;
                                          }
                                          // Continuar com o processamento do pedido à API

                                            Controlo de acessos e autorizações

                                            Princípio do menor privilégio

                                            Dá a cada utilizador ou processo apenas os direitos necessários para cumprir as suas tarefas específicas.

                                            Montar uma política de controlo de acessos eficaz

                                            Exemplo simples de controlo de acessos baseado em papéis:

                                            php
                                            function hasPermission($userId, $action) {
                                                $userRole = getUserRole($userId); // Função para obter o papel do utilizador
                                                $permissions = [
                                                    'admin' => ['read', 'write', 'delete'],
                                                    'editor' => ['read', 'write'],
                                                    'viewer' => ['read']
                                                ];
                                            
                                            return in_array($action, $permissions[$userRole] ?? []);
                                            }
                                            
                                            // Utilização
                                            if (hasPermission($userId, 'write')) {
                                                // Autorizar a ação de escrita
                                            } else {
                                                // Recusar o acesso
                                            }

                                            Segurança do código e da infraestrutura

                                                • Forma a tua equipa em técnicas de programação segura.
                                                • Usa frameworks e bibliotecas com boa reputação em matéria de segurança.
                                                • Faz revisões de código regulares centradas na segurança.
                                                • Mantém um inventário atualizado de todas as dependências.
                                                • Usa ferramentas automáticas para detetar vulnerabilidades nas bibliotecas de terceiros.
                                                • Aplica o princípio da defesa em profundidade, protegendo cada camada da infraestrutura.

                                              Testes e monitorização contínua

                                                  • Faz testes de intrusão pelo menos uma vez por ano ou depois de cada alteração de fundo.
                                                  • Coloca à frente um firewall aplicacional web (WAF) para bloquear muitos dos ataques mais comuns.
                                                  • Configura alertas para as atividades suspeitas.
                                                  • Guarda os logs durante tempo suficiente para permitir análises forenses.

                                                Gestão de vulnerabilidades e atualizações

                                                    • Estabelece um processo sistemático para aplicar as correções de segurança.
                                                    • Subscreve os boletins de segurança dos fornecedores do software que usas.

                                                  Formação e sensibilização para a segurança

                                                      • Organiza sessões de formação regulares sobre as técnicas de segurança mais recentes.
                                                      • Educa os utilizadores nas boas práticas de segurança (criar palavras-passe fortes, detetar phishing, etc.).

                                                    Conformidade e normas de segurança

                                                        • Garante que a tua aplicação web cumpre a regulamentação em vigor (RGPD, PCI DSS, etc.).
                                                        • Usa o Top 10 da OWASP como referência para identificar e corrigir as vulnerabilidades mais críticas.

                                                      Conclusão

                                                      Proteger uma aplicação web é um processo contínuo, que exige vigilância constante. Ao adotares estas boas práticas, reforças bastante a defesa das tuas aplicações contra as ciberameaças de hoje e de amanhã.

                                                      Damien Flandrin Programador web desde 2010, criador da Gekkode e do Email Impact. Cada artigo é testado num projeto real antes de ser publicado. Contacto
                                                      Newsletter

                                                      Os novos testes, tutoriais e projetos, por e-mail.

                                                      Testes reproduzíveis, código versionado, resultados datados. Nunca spam.