Detectar y evitar la apropiación fraudulenta de cuentas

En esta página se describe cómo detectar y evitar las apropiaciones de cuentas (ATOs) con reCAPTCHA.

Los ataques de apropiación de cuentas suelen producirse cuando un atacante envía solicitudes para iniciar sesión en los endpoints de las APIs con credenciales obtenidas de una brecha de seguridad de datos, también conocida como volcado de contraseñas. Este tipo de ataque puede tener éxito, aunque la filtración de contraseñas proceda de un sitio no relacionado, porque los usuarios suelen reutilizar contraseñas en varias cuentas. Este tipo de ataque no afecta a los usuarios que siguen buenas prácticas de higiene de contraseñas, como usar un gestor de contraseñas.

Antes de empezar

Prepara tu entorno para reCAPTCHA.

Detectar y prevenir la apropiación de cuentas

Con reCAPTCHA, puedes detectar y evitar las apropiaciones de cuentas mediante una de las siguientes opciones:

Usar la casilla No soy un robot

Añadir la casilla No soy un robot a tu sitio es la forma más rápida y sencilla de protegerte contra los ataques de apropiación de cuentas sin tener que integrar funciones adicionales, como la verificación por SMS o correo electrónico. Para un atacante, supone un coste el hecho de eludir esta protección, por lo que esta opción podría ser suficiente para algunos sitios.

Añade la casilla "No soy un robot" en tus páginas web.

El siguiente código es un ejemplo real de una página de inicio de sesión protegida por la casilla:

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 haciendo clic en el icono <> situado 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>

Usar puntuaciones y retos personalizados

Para protegerse frente a los ataques de apropiación de cuentas, utilice las claves basadas en puntuación de reCAPTCHA y los retos de autenticación multifactor (MFA), como los retos por correo electrónico y SMS en los que se envían códigos de un solo uso (OTPs) al usuario.

Para usar claves basadas en puntuación y retos personalizados, puedes usar las siguientes opciones:

En función de tu caso práctico, puedes usar la MFA por sí sola o con llaves basadas en puntuación. Por ejemplo, puede que prefieras usar los retos de MFA solo para las puntuaciones que estén por debajo de un umbral determinado para reducir la fricción.

En el siguiente ejemplo se muestra cómo integrar claves basadas en puntuación en el escenario de inicio de sesión.

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 haciendo clic en el icono <> situado 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>

Siguientes pasos