Detete e impeça a apropriação de contas

Esta página descreve como detetar e impedir a apropriação de contas (ATOs) com o reCAPTCHA.

Os ataques de ATO ocorrem normalmente quando um atacante envia pedidos para iniciar sessão em pontos finais da API através de credenciais obtidas a partir de uma violação de dados, também conhecida como um roubo de palavras-passe. Este tipo de ataque pode ser bem-sucedido, mesmo que a divulgação de palavras-passe seja de um site não relacionado, porque as pessoas tendem a reutilizar palavras-passe em várias contas. Este tipo de ataque não afeta os utilizadores que praticam uma higiene de palavras-passe adequada, como a utilização de um gestor de palavras-passe.

Antes de começar

Prepare o seu ambiente para o reCAPTCHA.

Detete e impeça ATOs

Com o reCAPTCHA, pode detetar e impedir ATOs através de uma das seguintes opções:

Use a caixa de verificação Não sou um robô

Adicionar a caixa de verificação Não sou um robô ao seu site é a forma mais rápida e fácil de oferecer alguma proteção contra ATOs sem ter de integrar funcionalidades adicionais, como a validação por SMS ou email. Existe um custo para um atacante quebrar esta proteção e esta opção pode ser suficiente para alguns sites.

Adicione a caixa de verificação "Não sou um robô" nas suas páginas Web.

O código seguinte é um exemplo em direto de uma página de início de sessão protegida pela caixa de verificação:

function onSuccess(token) {
  // The token is included in the POST data in the g-recaptcha-response
  // parameter. The backend must create an Assessment with the token
  // and verify the token is valid.
  console.log(token);
}
<form id="loginForm" action="?" method="POST">
  Username: <input type="text" name="username"/><br/>
  Password: <input type="password" name="password"/><br/>
  <div class="g-recaptcha" data-sitekey="reCATCHA_sitekey"
       data-action="account_login" data-callback="onSuccess"></div>
</form>
<script src="https://www.google.com/recaptcha/enterprise.js" async defer></script>

Pode experimentar este código no JSFiddle clicando no ícone <> no canto superior direito da janela de código.

<html>
  <head>
    <title>Account Login - Checkbox</title>
    <script src="https://www.google.com/recaptcha/enterprise.js" async defer></script>
    <script>
    function onSuccess(token) {
      // The token is included in the POST data in the g-recaptcha-response
      // parameter. The backend must create an Assessment with the token
      // and verify the token is valid.
      console.log(token);
    }
    </script>
  </head>
  <body>
    <form id="loginForm" action="?" method="POST">
      Username: <input type="text" name="username"/><br/>
      Password: <input type="password" name="password"/><br/>
      <div class="g-recaptcha" data-sitekey="6LeAkOgUAAAAACcy3uY6N9H9SJMS27n3Zx2OOnYK"
           data-action="account_login" data-callback="onSuccess"></div>
    </form>
  </body>
</html>

Use pontuações e desafios personalizados

Para se proteger contra ATOs, use chaves baseadas em pontuação do reCAPTCHA e use desafios de autenticação multifator (MFA), como desafios de email e SMS nos quais são enviados códigos únicos (OTPs) ao utilizador.

Para usar chaves baseadas em pontuação e desafios personalizados, considere as seguintes opções:

Consoante o seu exemplo de utilização, pode usar a MFA de forma autónoma ou com chaves baseadas em pontuações. Por exemplo, pode preferir usar desafios de MFA apenas para pontuações abaixo de um determinado limite para reduzir o atrito.

O exemplo seguinte mostra como integrar chaves baseadas em pontuação no cenário de início de sessão.

function submitForm() {
  grecaptcha.enterprise.ready(function() {
    grecaptcha.enterprise.execute(
      'reCAPTCHA_site_key', {action: 'account_login'}).then(function(token) {
       document.getElementById("token").value = token;
       document.getElementByID("loginForm").submit();
    });
  });
}
<form id="loginForm" action="?" method="POST">
  Username: <input type="text" name="username"/><br/>
  Password: <input type="password" name="password"/><br/>
  <input type="hidden" id="token" name="recaptcha_token"/>
  <button onclick="submitForm()">Login</button>
</form>
<script src="https://www.google.com/recaptcha/enterprise.js" async defer></script>

Pode experimentar este código no JSFiddle clicando no ícone <> no canto superior direito da janela de código.

<html>
  <head>
    <title>Account Login - Score</title>
    <script src="https://www.google.com/recaptcha/enterprise.js" async defer></script>
    <script>
    function submitForm() {
      grecaptcha.enterprise.ready(function() {
        grecaptcha.enterprise.execute(
          'reCAPTCHA_site_key', {action: 'account_login'}).then(function(token) {
           document.getElementById("token").value = token;
           document.getElementByID("loginForm").submit();
        });
      });
    }
    </script>
  </head>
  <body>
    <form id="loginForm" action="?" method="POST">
      Username: <input type="text" name="username"/><br/>
      Password: <input type="password" name="password"/><br/>
      <input type="hidden" id="token" name="recaptcha_token"/>
      <button onclick="submitForm()">Login</button>
    </form>
  </body>
</html>

O que se segue?