Implementando autenticação multifator (MFA) segura no PHP

Métodos para adicionar autenticação multifator (MFA) no PHP, aumentando a segurança contra invasões e acessos indevidos.

Introdução

A autenticação multifator (MFA) adiciona uma camada extra de segurança, exigindo que o usuário forneça mais de um fator de autenticação para acessar sua conta. Isso protege contra roubo de senhas e acessos indevidos.

1. Como funciona a autenticação multifator?

A MFA combina pelo menos dois dos três fatores de autenticação:

  • Algo que você sabe (senha, PIN);
  • Algo que você tem (código enviado por SMS, aplicativo autenticador);
  • Algo que você é (biometria, reconhecimento facial).

A implementação mais comum é o uso de um código temporário enviado via e-mail, SMS ou gerado por aplicativos autenticadores como Google Authenticator.

2. Gerando um código de autenticação por e-mail

Uma maneira simples de adicionar MFA é enviar um código de verificação por e-mail:

$codigo = rand(100000, 999999);
$_SESSION['mfa_codigo'] = $codigo;
mail($_SESSION['email_usuario'], "Seu código de autenticação", "Código: $codigo");

O usuário deve inserir esse código na tela de verificação para prosseguir.

3. Validando o código de autenticação

Ao receber o código do usuário, validamos se ele corresponde ao gerado anteriormente:

if ($_POST['codigo'] != $_SESSION['mfa_codigo']) {
    die("Código de autenticação inválido!");
}

Após a validação, podemos destruir a sessão do código para impedir reutilizações:

unset($_SESSION['mfa_codigo']);

4. Utilizando Google Authenticator com TOTP

Uma abordagem mais segura é a autenticação baseada em tempo (TOTP). Para isso, utilizamos a biblioteca spomky-labs/otphp:

composer require spomky-labs/otphp

Geramos um código TOTP para o usuário:

use OTPHP\TOTP;

$totp = TOTP::create();
$totp->setLabel('Minha Aplicação');
$totp->setIssuer('Minha Empresa');
echo "Escaneie este QR Code: " . $totp->getProvisioningUri();

O usuário escaneia o QR Code e, ao tentar autenticar, insere o código gerado pelo Google Authenticator:

if (!$totp->verify($_POST['codigo'])) {
    die("Código TOTP inválido!");
}

5. Implementando um backup de recuperação

Caso o usuário perca o acesso ao MFA, podemos oferecer códigos de recuperação pré-gerados:

$codigos_recuperacao = [bin2hex(random_bytes(4)), bin2hex(random_bytes(4))];
file_put_contents("codigos_recuperacao.txt", implode("\n", $codigos_recuperacao));

O usuário pode utilizar um desses códigos em caso de emergência.

Conclusão

A autenticação multifator no PHP fortalece a segurança do sistema e reduz riscos de acesso não autorizado. O uso de e-mails, SMS e aplicativos autenticadores melhora a proteção e garante maior confiabilidade na autenticação.

A autenticação multifator se tornou uma exigência em aplicações modernas, pois senhas sozinhas não são mais suficientes para garantir a segurança dos usuários. Vazamentos de credenciais ocorrem com frequência e o MFA adiciona uma camada extra de proteção contra acessos não autorizados.

Ao implementar MFA no PHP, podemos oferecer opções como verificação por e-mail, SMS ou aplicativos autenticadores, garantindo que apenas o usuário legítimo consiga acessar sua conta. Além disso, permitir códigos de recuperação evita bloqueios em caso de perda do segundo fator.

Com essas práticas, reduzimos o risco de ataques de força bruta e aumentamos a proteção das contas dos usuários, tornando a aplicação mais segura e confiável.

Algumas aplicações:

  • Impedir acessos não autorizados mesmo se uma senha for comprometida.
  • Adicionar uma camada extra de segurança em áreas sensíveis da aplicação.
  • Garantir a conformidade com padrões de segurança modernos.
  • Reduzir o risco de ataques de força bruta e roubo de credenciais.

Dicas para quem está começando

  • Comece com MFA via e-mail ou SMS antes de implementar TOTP.
  • Utilize bibliotecas confiáveis para gerar códigos TOTP, como otphp.
  • Forneça códigos de recuperação para evitar bloqueios de conta.
  • Não armazene códigos MFA no banco de dados sem criptografia.
  • Implemente MFA apenas para áreas críticas, como login e alteração de senha.

Contribuições de Renata Oliveira

Compartilhe este tutorial: Como implementar segurança de autenticação multifator (MFA) no PHP?

Compartilhe este tutorial

Continue aprendendo:

Como evitar o carregamento de bibliotecas externas inseguras no PHP?

Métodos para impedir o uso de bibliotecas externas inseguras no PHP, protegendo a aplicação contra vulnerabilidades e ataques.

Tutorial anterior

Como revisar e auditar o código PHP para identificar vulnerabilidades de segurança?

Métodos eficazes para revisar e auditar código PHP, garantindo que vulnerabilidades de segurança sejam identificadas e corrigidas antes de serem exploradas.

Próximo tutorial