检测和防范短信欺诈

本文档介绍了如何使用 reCAPTCHA 短信话费欺诈防护功能,在依赖短信进行双重身份验证 (2FA) 或手机验证的企业中检测和防范短信注入攻击,因为这些企业是短信话费欺诈的潜在目标。

基于短信的身份验证(双重身份验证和登录)是登录和注册安全方面的业界标准,但无法防范短信话费欺诈或短信注入欺诈。在您发送短信之前,reCAPTCHA 短信话费欺诈防护功能会为您提供一个风险得分,以指明相应手机号码实施短信话费欺诈的可能性。根据此得分,您可以在欺诈性短信发送到短信提供商之前允许或屏蔽这些短信。

如需了解详情,请参阅 reCAPTCHA 短信话费欺诈防护博文

准备工作

根据您是 reCAPTCHA 的现有用户还是 reCAPTCHA 新手,请按照相应标签页中的说明操作:

现有 reCAPTCHA 用户

如果您是 reCAPTCHA 的现有用户,请在您的 Google Cloud 项目中启用 reCAPTCHA 短信话费欺诈防护:

  1. 在 Google Cloud 控制台中,前往 reCAPTCHA 页面。

    前往 reCAPTCHA

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

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

  3. 点击 设置

  4. 如果您的项目未启用 reCAPTCHA 账号卫士,请执行以下操作:

    1. 账号卫士窗格中,点击启用
    2. 配置账号卫士对话框中,点击启用
  5. 短信话费欺诈防护窗格中,点击配置

  6. 点击启用切换开关,然后点击保存

    启用 reCAPTCHA 短信话费欺诈防护的操作可能需要几分钟才能传播到我们的系统。启用该功能的操作传播到我们的系统后,您将在评估过程中开始接收与 reCAPTCHA 短信话费欺诈防护相关的响应。

新 reCAPTCHA 用户

如果您刚开始接触 reCAPTCHA,请执行以下操作:

  1. 根据您要在网站还是移动应用中使用 reCAPTCHA 短信话费欺诈防护,请按照以下步骤集成 reCAPTCHA:

  2. 在您的 Google Cloud 项目中启用 reCAPTCHA 短信话费欺诈防护:
    1. 在 Google Cloud 控制台中,前往 reCAPTCHA 页面。

      前往 reCAPTCHA

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

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

    3. 点击 设置

    4. 如果您的项目未启用 reCAPTCHA 账号卫士,请执行以下操作:

      1. 账号卫士窗格中,点击启用
      2. 配置账号卫士对话框中,点击启用
    5. 短信话费欺诈防护窗格中,点击配置

    6. 点击启用切换开关,然后点击保存

      启用 reCAPTCHA 短信话费欺诈防护的操作可能需要几分钟才能传播到我们的系统。启用该功能的操作传播到我们的系统后,您将在评估过程中开始接收与 reCAPTCHA 短信话费欺诈防护相关的响应。

使用手机号码创建评估

对于 reCAPTCHA 短信付费欺诈防范,请使用后端的 reCAPTCHA 客户端库或 REST API,通过 execute() 函数生成的令牌和手机号码创建评估。

本文档介绍了如何使用 REST API 创建评估。如需了解如何使用客户端库创建评估,请参阅创建评估

在创建评估之前,请执行以下操作:

  • 设置 reCAPTCHA 身份验证。

    您可以选择的身份验证方法取决于 reCAPTCHA 的设置环境。下表可帮助您选择适当的身份验证方法和支持的接口来设置身份验证:

    环境 接口 身份验证方法
    Google Cloud
    • REST
    • 客户端库
    使用关联的服务账号
    本地或其他云服务提供商 REST 使用 API 密钥工作负载身份联合

    如果您想使用 API 密钥,我们建议您通过应用 API 密钥限制来保护 API 密钥。

    客户端库

    使用以下资源:

  • 选择一个稳定的账号标识符 accountId(用户不经常更改),并在 projects.assessments.create 方法中将其提供给评估。与同一用户相关的所有事件都应具有相同的稳定账号标识符值。您可以提供以下账号标识符:

    用户标识符

    如果每个账号都可以与稳定的用户名、电子邮件地址或手机号码进行唯一关联,您可以将其用作 accountId。当您提供此类跨网站标识符(可在多个网站中重复使用的标识符)时,reCAPTCHA 会使用这些信息,通过标记滥用账号标识符并利用与这些标识符相关的跨网站滥用行为模式知识,根据跨网站模型加强对用户账号的保护。

    或者,如果您有与每个账号唯一关联的内部用户 ID,则可以将其作为 accountId 提供。

    经过哈希处理或加密

    如果您没有与每个账号唯一关联的内部用户 ID,则可以将任何稳定标识符转换为不透明的网站专用账号标识符。reCAPTCHA 账号卫士仍需要此标识符来了解用户活动模式并检测异常行为,但不会与其他网站共享此标识符。

    选择任何稳定的账号标识符,并使用加密或哈希处理使其不透明,然后再发送到 reCAPTCHA:

    • 加密(推荐):使用可生成稳定密文的确定性加密方法对账号标识符进行加密。如需了解详细说明,请参阅确定性地加密数据。如果您选择对称加密而非哈希处理,则无需在用户标识符与相应的不透明用户标识符之间保持映射。 解密 reCAPTCHA 返回的不透明标识符,将其转换为用户标识符。

    • 哈希处理:我们建议使用 SHA256-HMAC 方法和您选择的自定义盐对账号标识符进行哈希处理。由于哈希值是单向的,因此您需要在生成的哈希值和用户标识符之间保持映射,以便将返回的经过哈希处理的账号标识符映射回原始账号。

accountId 参数和采用 E.164 格式的手机号码添加为 UserId,以便在 projects.assessments.create 方法的评估中进行验证。

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

  • PROJECT_ID:您的 Google Cloud 项目 ID。
  • TOKEN:从 grecaptcha.enterprise.execute() 调用返回的令牌。
  • KEY_ID:您在网站上安装的基于得分的键。
  • ACCOUNT_ID:用户账号的标识符,该标识符应是您网站上唯一的。
  • PHONE_NUMBER:需要检查是否存在恶意行为的手机号码。手机号码必须采用 E.164 格式,且不得经过哈希处理或加密。

HTTP 方法和网址:

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

请求 JSON 正文:


{
  "event": {
    "token": "TOKEN",
    "siteKey": "KEY_ID",
    "userInfo": {
      "accountId": "ACCOUNT_ID",
      "userIds": [
        {
          "phoneNumber": "PHONE_NUMBER"
        }
      ]
    }
  }
}

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

curl

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

curl -X POST \
-H "Authorization: Bearer $(gcloud auth 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 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 响应:


{
  "event": {
     …
  },
  "name": "ASSESSMENT_ID",
  "smsFraudAssessment": {
    "smsFraudRisk": 0.3
  }
}

您收到的响应中会在 smsFraudAssessment 字段中包含 smsFraudRisk 分数。分数越高,手机号码风险越大;分数越低,手机号码合法性越高。

您需对根据此评估采取的措施负责。 如需进行最简单的集成,您可以在 smsFraudRisk 上设置阈值,以便为您的决策提供参考。

为评估添加注释

为了跟踪短信流量并提高欺诈检测质量,您必须在发送短信或成功验证手机号码后的 10 分钟内为评估添加注释。

如需为评估添加注释,请向 projects.assessments.annotate 方法发送包含评估 ID 的请求。在该请求的正文中,在 phoneAuthenticationEvent 字段中添加采用 E.164 格式的手机号码。

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

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

    下表列出了可用于为事件添加注解的标签和值:

    标签 说明 请求示例
    reasons

    必需。用于支持您的评估的标签。

    请在事件发生后的几秒或几分钟内在 reasons 标签中提供实时事件详情,因为这些详情会影响实时检测。

    可能的值:

    • INITIATED_TWO_FACTOR:通过短信发送验证码。
    • PASSED_TWO_FACTOR:验证码已成功通过验证。
    • FAILED_TWO_FACTOR:验证码无效。
        {
        "reasons": ["INITIATED_TWO_FACTOR"],
        "phoneAuthenticationEvent": {
          "phoneNumber": "+18005550175"
        }
      }
    annotation

    可选。用于指示评估结果是否合法的标签。

    提供有关登录和注册事件的事实,以验证或更正 annotation 标签中的风险评估。

    可能的值:LEGITIMATEFRAUDULENT

    我们建议您在事件发生几秒或几分钟后发送此信息,因为它会影响实时检测。

      {
       "annotation": "LEGITIMATE"
      }
      
  2. 使用适当的标签创建注解请求。

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

    • ASSESSMENT_ID:从 projects.assessments.create 调用返回的 name 字段的值。
    • ANNOTATION:可选。指示评估结果是合法还是欺诈的标签。
    • REASONS:支持您添加注解的原因。如需查看可能值的列表,请参阅原因值
    • PHONE_NUMBER:被评估的手机号码。手机号码必须采用 E.164 格式,且不得经过哈希处理或加密。

    HTTP 方法和网址:

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

    请求 JSON 正文:

    {
      "annotation": ANNOTATION,
      "reasons": REASONS,
      "phoneAuthenticationEvent": {
        "phoneNumber": "PHONE_NUMBER"
      }
    }
    

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

    curl

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

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth 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 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) 和一个空响应。

后续步骤