检测并防止与帐号相关的欺诈活动

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

本文档介绍如何使用 reCAPTCHA Enterprise 帐号卫士检测并防止与帐号相关的欺诈活动。

reCAPTCHA Enterprise 可帮助您保护关键操作,例如登录和结账。但是,可以通过观察一段时间内特定用户在网站上的行为,检测出许多细微的帐号滥用情况。reCAPTCHA Enterprise 帐号卫士通过为您的网站创建特定于网站的模型来检测可疑行为的趋势或活动的变化,从而帮助识别这些细微的滥用情况。通过使用特定于网站的模型,reCAPTCHA Enterprise 帐号卫士可帮助您检测以下内容:

  • 可疑活动
  • 行为相似的帐号
  • 来自标记为“特定用户”的受信任设备的请求

根据 reCAPTCHA Enterprise 帐号卫士的分析和特定于网站的模型,您可以执行以下操作:

  • 限制或停用欺诈性帐号。
  • 防止帐号盗用尝试。
  • 帮助客户成功接管帐号。
  • 仅授予对来自合法用户帐号的请求的访问权限。
  • 减少用户从可信设备登录时遇到的不便。

准备工作

选择在您的环境中设置 reCAPTCHA Enterprise 的最佳方法,并完成设置。

启用 reCAPTCHA Enterprise 帐号卫士

  1. 在 Google Cloud Console 中,转到 reCAPTCHA Enterprise 页面。

    转到 reCAPTCHA Enterprise

  2. 验证项目名称是否显示在页面顶部的资源选择器中。

    如果您没有看到项目名称,请点击资源选择器,然后选择您的项目。

  3. 点击 设置

  4. 帐号卫士窗格中,点击启用

  5. 配置帐号卫士对话框中,点击启用

启用 reCAPTCHA Enterprise 帐号卫士的操作可能需要几个小时才能传播到我们的系统。启用该功能的操作传播到我们的系统后,您将在评估过程中开始接收与帐号卫士相关的响应。

了解工作流

如需使用 reCAPTCHA Enterprise 帐号卫士,请执行以下步骤:

  1. 在客户端(网页或移动应用)上安装基于得分的网站密钥
  2. 使用 hashedAccountId 创建评估
  3. 解读评估详情
  4. 使用与帐号相关的元数据注解评估

完成上述步骤后,您可以选择识别行为相似的帐号

在客户端上安装基于得分的网站密钥

要使用 reCAPTCHA Enterprise 帐号卫士,请按照特定于平台的说明在登录和注册页面上安装基于得分的网站密钥:

为了获得准确的结果,我们建议在关键操作(例如登录和结账)之前和之后显示的页面上安装基于得分的网站密钥。例如,假设某个客户工作流包含在网站上访问首页、登录页面和欢迎页面。在此工作流中,您将通过在登录页面上安装基于得分的网站密钥来保护登录页面。我们建议在首页和欢迎页面上安装基于得分的网站密钥,以获取准确的结果。

当您在网站或移动应用的各个页面上安装具有唯一操作的基于得分的网站密钥时,reCAPTCHA Enterprise 帐号卫士会根据合法和欺诈帐号的行为创建特定于网站的自定义模型。如需了解如何使用唯一操作安装基于得分的网站密钥,请参阅为用户操作安装基于得分的网站密钥

使用 hashedAccountId 创建评估

为关键操作创建评估。关键操作包括成功和失败的登录、注册以及已登录用户的其他操作。

如需使用 hashedAccountId 创建评估,请执行以下操作:

  1. 使用 SHA256-HMAC 方法为您的网站的用户帐号生成一个具有唯一性的稳定哈希用户标识符。您可以通过用户 ID、用户名或电子邮件地址生成此标识符。

  2. 将经过哈希处理的用户标识符附加到 projects.assessments.create 方法中的 hashedAccountId 参数。hashedAccountId 允许 reCAPTCHA Enterprise 帐号卫士检测欺诈性帐号和被盗用的帐号。

    在使用任何请求数据之前,请先进行以下替换:

    • PROJECT_ID:您的 Google Cloud 项目 ID
    • TOKEN:从 grecaptcha.enterprise.execute() 调用返回的令牌
    • KEY:与网站/应用关联的 reCAPTCHA 密钥
    • HASHED_ACCOUNT_ID:使用 SHA256-HMAC 方法为网站访问用户帐号生成的经过哈希处理的稳定用户标识符

    HTTP 方法和网址:

    POST https://recaptchaenterprise.googleapis.com/v1/projects/PROJECT_ID/assessments

    请求 JSON 正文:

    {
      "event": {
        "token": "TOKEN",
        "siteKey": "KEY",
        "hashedAccountId": "HASHED_ACCOUNT_ID"
      }
    }
    

    如需发送请求,请选择以下方式之一:

    curl

    将请求正文保存在名为 request.json 的文件中,然后执行以下命令:

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://recaptchaenterprise.googleapis.com/v1/projects/PROJECT_ID/assessments"

    PowerShell

    将请求正文保存在名为 request.json 的文件中,然后执行以下命令:

    $cred = gcloud auth application-default print-access-token
    $headers = @{ "Authorization" = "Bearer $cred" }

    Invoke-WebRequest `
    -Method POST `
    -Headers $headers `
    -ContentType: "application/json; charset=utf-8" `
    -InFile request.json `
    -Uri "https://recaptchaenterprise.googleapis.com/v1/projects/PROJECT_ID/assessments" | Select-Object -Expand Content

    您应该会收到类似以下内容的 JSON 响应:

    {
      "tokenProperties": {
        "valid": true,
        "hostname": "www.google.com",
        "action": "login",
        "createTime": "2019-03-28T12:24:17.894Z"
       },
      "riskAnalysis": {
        "score": 0.6,
      },
     "event": {
        "token": "TOKEN",
        "siteKey": "KEY",
        "expectedAction": "USER_ACTION"
      },
      "name": "projects/PROJECT_ID/assessments/b6ac310000000000",
      "accountDefenderAssessment": {
        labels: ["SUSPICIOUS_LOGIN_ACTIVITY"]
      }
    }
    
    

代码示例

Java


import com.google.cloud.recaptchaenterprise.v1.RecaptchaEnterpriseServiceClient;
import com.google.protobuf.ByteString;
import com.google.recaptchaenterprise.v1.AccountDefenderAssessment.AccountDefenderLabel;
import com.google.recaptchaenterprise.v1.Assessment;
import com.google.recaptchaenterprise.v1.CreateAssessmentRequest;
import com.google.recaptchaenterprise.v1.Event;
import com.google.recaptchaenterprise.v1.ProjectName;
import com.google.recaptchaenterprise.v1.RiskAnalysis.ClassificationReason;
import com.google.recaptchaenterprise.v1.TokenProperties;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.List;
import java.util.UUID;

public class AccountDefenderAssessment {

  public static void main(String[] args) throws IOException, NoSuchAlgorithmException {
    // TODO(developer): Replace these variables before running the sample.
    // projectId: Google Cloud Project ID
    String projectId = "project-id";

    // recaptchaSiteKey: Site key obtained by registering a domain/app to use recaptcha
    // services.
    String recaptchaSiteKey = "recaptcha-site-key";

    // token: The token obtained from the client on passing the recaptchaSiteKey.
    // To get the token, integrate the recaptchaSiteKey with frontend. See,
    // https://cloud.google.com/recaptcha-enterprise/docs/instrument-web-pages#frontend_integration_score
    String token = "recaptcha-token";

    // recaptchaAction: The action name corresponding to the token.
    String recaptchaAction = "recaptcha-action";

    // Unique ID of the customer, such as email, customer ID, etc.
    String userIdentifier = "default" + UUID.randomUUID().toString().split("-")[0];

    // Hash the unique customer ID using HMAC SHA-256.
    MessageDigest digest = MessageDigest.getInstance("SHA-256");
    byte[] hashBytes = digest.digest(userIdentifier.getBytes(StandardCharsets.UTF_8));
    ByteString hashedAccountId = ByteString.copyFrom(hashBytes);

    accountDefenderAssessment(projectId, recaptchaSiteKey, token, recaptchaAction, hashedAccountId);
  }

  /**
   * This assessment detects account takeovers. See,
   * https://cloud.google.com/recaptcha-enterprise/docs/account-takeovers The input is the hashed
   * account id. Result tells if the action represents an account takeover. You can optionally
   * trigger a Multi-Factor Authentication based on the result.
   */
  public static void accountDefenderAssessment(
      String projectId,
      String recaptchaSiteKey,
      String token,
      String recaptchaAction,
      ByteString hashedAccountId)
      throws IOException {
    try (RecaptchaEnterpriseServiceClient client = RecaptchaEnterpriseServiceClient.create()) {

      // Set the properties of the event to be tracked.
      Event event =
          Event.newBuilder()
              .setSiteKey(recaptchaSiteKey)
              .setToken(token)
              // Set the hashed account id (of the user).
              // Recommended approach: HMAC SHA256 along with salt (or secret key).
              .setHashedAccountId(hashedAccountId)
              .build();

      // Build the assessment request.
      CreateAssessmentRequest createAssessmentRequest =
          CreateAssessmentRequest.newBuilder()
              .setParent(ProjectName.of(projectId).toString())
              .setAssessment(Assessment.newBuilder().setEvent(event).build())
              .build();

      Assessment response = client.createAssessment(createAssessmentRequest);

      // Check integrity of the response token.
      if (!checkTokenIntegrity(response.getTokenProperties(), recaptchaAction)) {
        return;
      }

      // Get the reason(s) and the reCAPTCHA risk score.
      // For more information on interpreting the assessment,
      // see: https://cloud.google.com/recaptcha-enterprise/docs/interpret-assessment
      for (ClassificationReason reason : response.getRiskAnalysis().getReasonsList()) {
        System.out.println(reason);
      }
      float recaptchaScore = response.getRiskAnalysis().getScore();
      System.out.println("The reCAPTCHA score is: " + recaptchaScore);
      String assessmentName = response.getName();
      System.out.println(
          "Assessment name: " + assessmentName.substring(assessmentName.lastIndexOf("/") + 1));

      // Get the Account Defender result.
      com.google.recaptchaenterprise.v1.AccountDefenderAssessment accountDefenderAssessment =
          response.getAccountDefenderAssessment();
      System.out.println(accountDefenderAssessment);

      // Get Account Defender label.
      List<AccountDefenderLabel> defenderResult =
          response.getAccountDefenderAssessment().getLabelsList();
      // Based on the result, can you choose next steps.
      // If the 'defenderResult' field is empty, it indicates that Account Defender did not have
      // anything to add to the score.
      // Few result labels: ACCOUNT_DEFENDER_LABEL_UNSPECIFIED, PROFILE_MATCH,
      // SUSPICIOUS_LOGIN_ACTIVITY, SUSPICIOUS_ACCOUNT_CREATION, RELATED_ACCOUNTS_NUMBER_HIGH.
      // For more information on interpreting the assessment, see:
      // https://cloud.google.com/recaptcha-enterprise/docs/account-defender#interpret-assessment-details
      System.out.println("Account Defender Assessment Result: " + defenderResult);
    }
  }

  private static boolean checkTokenIntegrity(
      TokenProperties tokenProperties, String recaptchaAction) {
    // Check if the token is valid.
    if (!tokenProperties.getValid()) {
      System.out.println(
          "The Account Defender Assessment call failed because the token was: "
              + tokenProperties.getInvalidReason().name());
      return false;
    }

    // Check if the expected action was executed.
    if (!tokenProperties.getAction().equals(recaptchaAction)) {
      System.out.printf(
          "The action attribute in the reCAPTCHA tag '%s' does not match "
              + "the action '%s' you are expecting to score",
          tokenProperties.getAction(), recaptchaAction);
      return false;
    }
    return true;
  }
}

解读评估详情

创建评估后,您会收到如下 JSON 示例的响应。reCAPTCHA Enterprise 帐号卫士会在评估响应中返回 accountDefenderAssessmentaccountDefenderAssessment 的值可帮助您评估用户活动是合法的还是欺诈性的。

{
  "tokenProperties": {
    "valid": true,
    "hostname": "www.google.com",
    "action": "login",
    "createTime": "2019-03-28T12:24:17.894Z"
   },
  "riskAnalysis": {
    "score": 0.6,
  },
 "event": {
    "token": "TOKEN",
    "siteKey": "KEY",
    "expectedAction": "USER_ACTION"
  },
  "name": "projects/PROJECT_ID/assessments/b6ac310000000000",
  "accountDefenderAssessment": {
    labels: ["SUSPICIOUS_LOGIN_ACTIVITY"]
  }
}

accountDefenderAssessment 字段可以是以下任何值:

  • PROFILE_MATCH:表示该用户的属性与之前为该特定用户看过的属性匹配。此值表示该用户所使用的可信设备之前曾用于访问您的网站。

    只有在以下情况下,才会返回 PROFILE_MATCH

    • 您可以使用多重身份验证 (MFA) 或双重身份验证 (2FA),reCAPTCHA Enterprise 帐号卫士会在用户通过 MFA 或 2FA 挑战后将用户个人资料标记为可信。

    • 您将评估注解为 LEGITIMATE,并且 reCAPTCHA Enterprise 帐号卫士会将相应的用户个人资料标记为可信。

  • SUSPICIOUS_LOGIN_ACTIVITY:表示请求与之前存在可疑登录活动的配置文件匹配。此值可能表示发生了与此请求类似的凭据填充攻击。

  • SUSPICIOUS_ACCOUNT_CREATION:表示请求与之前存在可疑帐号创建行为的配置文件匹配。此值可能表示此帐号是虚假帐号或欺诈性帐号。

使用与帐号相关的元数据注解评估

为您的评估添加注解,以使 reCAPTCHA Enterprise 帐号卫士执行以下操作:

  • 分析特定标识符的所有互动,并返回准确的得分和原因代码。
  • 为您的网站创建一个针对特定网站的攻击者模型。

在注解评估时,通过为已知事件添加标签,确认真正例和真负例的注解。最好为评估请求是合法请求还是欺诈性请求的事件添加注解,并包括评估的原因。但是,您也可以为任何先前的评估应用注解,而无需说明原因。

为评估添加注释时,您将向包含评估 ID 的 projects.assessments.annotate 方法发送请求。在该请求的正文中,您要包含标签,提供有关评估中所述的事件的附加信息。

如需为评估添加注解,请执行以下操作:

  1. 根据您的使用场景确定要在请求 JSON 正文中添加的标签。

    下表可帮助您了解可用于为评估添加注解的标签:

    标签 说明 示例用例
    annotation

    指示评估的合法性的标签。可能的值是 LEGITIMATEFRAUDULENT

    如果您想指示重要操作(如登录)的合法性,请使用此标签。

    如需表明登录事件是合法的,请使用以下请求 JSON 正文:

    
    {
    "annotation": "LEGITIMATE"
    }
    
    reasons

    为您的评估提供支持的标签。如需查看可能的值的列表,请参阅原因值

    使用此标签提供支持关键操作注释的原因。对于针对不存在的帐号发出的请求,我们建议使用 INCORRECT_PASSWORD

    • 如需区分失败的登录尝试,请使用以下 JSON 正文请求:

      
      {
      "reasons": ["INCORRECT_PASSWORD"]
      }
      
    • 要指示用户已成功通过双重身份验证挑战,请使用以下请求 JSON 正文:

      
      {
      "annotation": "LEGITIMATE",
      "reasons": ["PASSED_TWO_FACTOR"]
      }
      
    hashedAccountId

    将经过哈希处理的帐号 ID 与事件相关联的标签。经过哈希处理的帐号 ID 是使用 SHA256-HMAC 方法为网站上的用户帐号生成的一个经过哈希处理的稳定用户标识符。

    如果您创建的评估没有经过哈希处理的帐号 ID,请使用此标签提供事件的经过哈希处理的帐号 ID。

    如需指明某个事件与指定的经过哈希处理的帐号 ID 相关联,请使用以下请求 JSON 正文:

    
    {
    "hashedAccountId": "HASHED_ACCOUNT_ID"
    }
    

  2. 使用适当的标签创建注解请求。

    在使用任何请求数据之前,请先进行以下替换:

    • ASSESSMENT_ID:从 projects.assessments.create 调用返回的 name 字段的值。
    • ANNOTATION:可选。指示评估结果是合法还是欺诈的标签。
    • REASONS:可选。支持您的注解的原因。如需查看可能的值的列表,请参阅原因值
    • HASHED_ACCOUNT_ID:可选。使用您网站上用户帐号的 SHA256-HMAC 方法生成的稳定哈希用户标识符

    如需了解详情,请参阅注解标签

    HTTP 方法和网址:

    POST https://recaptchaenterprise.googleapis.com/v1/ASSESSMENT_ID:annotate

    请求 JSON 正文:

    {
      "annotation": ANNOTATION,
      "reasons": REASONS,
      "hashedAccountId": HASHED_ACCOUNT_ID
    }
    

    如需发送请求,请选择以下方式之一:

    curl

    将请求正文保存在名为 request.json 的文件中,然后执行以下命令:

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://recaptchaenterprise.googleapis.com/v1/ASSESSMENT_ID:annotate"

    PowerShell

    将请求正文保存在名为 request.json 的文件中,然后执行以下命令:

    $cred = gcloud auth application-default print-access-token
    $headers = @{ "Authorization" = "Bearer $cred" }

    Invoke-WebRequest `
    -Method POST `
    -Headers $headers `
    -ContentType: "application/json; charset=utf-8" `
    -InFile request.json `
    -Uri "https://recaptchaenterprise.googleapis.com/v1/ASSESSMENT_ID:annotate" | Select-Object -Expand Content

    您应该会收到一个成功的状态代码 (2xx) 和一个空响应。

代码示例

Java


import com.google.cloud.recaptchaenterprise.v1.RecaptchaEnterpriseServiceClient;
import com.google.protobuf.ByteString;
import com.google.recaptchaenterprise.v1.AnnotateAssessmentRequest;
import com.google.recaptchaenterprise.v1.AnnotateAssessmentRequest.Annotation;
import com.google.recaptchaenterprise.v1.AnnotateAssessmentRequest.Reason;
import com.google.recaptchaenterprise.v1.AnnotateAssessmentResponse;
import com.google.recaptchaenterprise.v1.AssessmentName;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;

public class AnnotateAccountDefenderAssessment {

  public static void main(String[] args) throws IOException, NoSuchAlgorithmException {
    // TODO(developer): Replace these variables before running the sample.
    // projectID: GCloud Project id.
    String projectID = "project-id";

    // assessmentId: Value of the 'name' field returned from the CreateAssessment call.
    String assessmentId = "account-defender-assessment-id";

    // hashedAccountId: Set the hashedAccountId corresponding to the assessment id.
    ByteString hashedAccountId = ByteString.copyFrom(new byte[] {});

    annotateAssessment(projectID, assessmentId, hashedAccountId);
  }

  /**
   * Pre-requisite: Create an assessment before annotating. Annotate an assessment to provide
   * feedback on the correctness of recaptcha prediction.
   */
  public static void annotateAssessment(
      String projectID, String assessmentId, ByteString hashedAccountId) throws IOException {

    try (RecaptchaEnterpriseServiceClient client = RecaptchaEnterpriseServiceClient.create()) {
      // Build the annotation request.
      // For more info on when/how to annotate, see:
      // https://cloud.google.com/recaptcha-enterprise/docs/annotate-assessment#when_to_annotate
      AnnotateAssessmentRequest annotateAssessmentRequest =
          AnnotateAssessmentRequest.newBuilder()
              .setName(AssessmentName.of(projectID, assessmentId).toString())
              .setAnnotation(Annotation.LEGITIMATE)
              .addReasons(Reason.PASSED_TWO_FACTOR)
              .setHashedAccountId(hashedAccountId)
              .build();

      // Empty response is sent back.
      AnnotateAssessmentResponse response = client.annotateAssessment(annotateAssessmentRequest);
      System.out.println("Annotated response sent successfully ! " + response);
    }
  }
}

后续步骤