Cómo detectar y evitar las apropiaciones de cuentas

En esta página, se describe cómo detectar y prevenir la apropiación de cuentas (ATO) mediante reCAPTCHA Enterprise.

Por lo general, los ataques de ATO se producen cuando un atacante envía solicitudes para acceder a extremos de API con credenciales obtenidas de un incumplimiento de datos, también conocido como vuelto de contraseña. Este tipo de ataque puede ser exitoso, incluso si el volcado de contraseñas proviene de un sitio no relacionado, porque los humanos tienden a reutilizar las contraseñas en varias cuentas. Este tipo de ataque no afecta a los usuarios que usan prácticas de contraseña adecuadas, como un administrador de contraseñas.

Con reCAPTCHA Enterprise, puedes detectar y prevenir los ATO mediante una de las siguientes opciones:

Cómo usar la casilla de verificación de "no soy robot"

Agregar la casilla de verificación No soy un robot al sitio es la forma más rápida y fácil de proporcionar protección contra los ATO sin tener que integrar funciones adicionales, como la verificación por correo electrónico o SMS. las rutas "a GCP". Un atacante podría dañar esta protección, y esta opción podría ser suficiente para algunos sitios.

Agrega la casilla de verificación "No soy un robot" en tus páginas web.

A continuación, se muestra un ejemplo real de una página de acceso simple protegida por la casilla de verificación.

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>

Puedes experimentar con este código en JSFiddle si haces clic en el icono <> en la esquina superior derecha de la ventana 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>

Uso de puntuaciones y desafíos personalizados

La mejor forma de protegerse con ATO es confiar en las claves del sitio basadas en la puntuación de reCAPTCHA y usar desafíos de autenticación de varios factores (MFA), como desafíos de correo electrónico y SMS en los que los códigos únicos (OTP) se envían al usuario.

Considera las siguientes opciones para protegerte contra ATO:

Según tu caso práctico, puedes usar MFA solo o con claves de sitio basadas en puntuaciones. Por ejemplo, es posible que prefieras usar desafíos de MFA solo para puntuaciones inferiores a un umbral determinado a fin de reducir la fricción.

En el siguiente ejemplo, se muestra cómo integrar claves del sitio basadas en puntuaciones en la situación de acceso.

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>

Puedes experimentar con este código en JSFiddle si haces clic en el icono <> en la esquina superior derecha de la ventana 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>