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 evitar ATOs

Com o reCAPTCHA, é possível detectar e impedir ATOs usando uma das seguintes 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>

Usar pontuações e desafios personalizados

Para se proteger contra ATOs, use as chaves de pontuação reCAPTCHA e os testes de autenticação multifator (MFA), como e-mail e SMS, em que códigos de uso único (OTPs, na sigla em inglês) são enviados para o 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, talvez você prefira usar os testes de MFA somente para pontuações abaixo de um determinado limite, para reduzir o atrito.

O exemplo a seguir mostra como integrar chaves baseadas em pontuação no cenário de login.

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