Detectar e impedir invasões de contas

Nesta página, descrevemos como detectar e evitar invasões de contas (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 evitar 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 ativo de uma página de login simples 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 as chaves baseadas em pontuação reCAPTCHA e os desafios de autenticação multifator (MFA), como desafios por 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 as seguintes opções:

Dependendo do 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 os desafios de MFA apenas para pontuações abaixo de um determinado limite para reduzir problemas.

O exemplo a seguir mostra como integrar chaves baseadas em pontuação ao 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