Detectar e impedir invasões de contas

Esta página descreve como detectar e impedir invasões de conta (ATOs, na sigla em inglês) usando o reCAPTCHA.

Os ataques de ATO geralmente ocorrem quando um invasor envia solicitações para fazer login nos endpoints da API usando credenciais recebidas de uma violação de dados, também conhecida como despejo de senha. Esse tipo de ataque pode ser bem-sucedido, mesmo se o despejo de senha for de um site não relacionado, porque os humanos tendem a reutilizar senhas em várias contas. Esse tipo de ataque não afeta usuários que praticam a limpeza adequada da senha, como o uso de um gerenciador de senhas.

Antes de começar

Prepare seu ambiente para o reCAPTCHA.

Detectar e prevenir ATOs

Com o reCAPTCHA, é possível detectar e impedir ATOs usando uma destas opções:

Usar a caixa de seleção "Não sou um robô"

Adicionar a caixa de seleção Não sou um robô ao site é a maneira mais rápida e fácil de proteger contra ATOs sem precisar integrar outros recursos, como verificação por SMS ou e-mail. Há um custo para que um invasor viole essa proteção, e essa opção pode ser suficiente para alguns sites.

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

O código a seguir é um exemplo real de uma página de login protegida pela caixa de seleçã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>

Você pode experimentar esse 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 o reCAPTCHA baseado em pontuação e usar desafios de autenticação multifator (MFA), como e-mail e SMS, em que códigos únicos (OTPs) são enviados ao usuário.

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

Dependendo do seu caso de uso, é possível usar a MFA por conta própria ou com chaves baseadas em pontuação. Por exemplo, você pode preferir usar desafios de autenticação multifator (MFA) somente para abaixo de um determinado limite para reduzir o atrito.

O exemplo a seguir mostra como integrar chaves baseadas em pontuação ao login diferente.

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>

Você pode experimentar esse 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>

A seguir