检测并防范短信欺诈

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

短信 2FA 是登录和注册安全的业界标准,但它并不能防范短信收费欺诈或短信提取欺诈。

reCAPTCHA 短信收费欺诈防护功能有助于保护您的企业,防范短信收费欺诈或短信提取欺诈,同时保持基于短信的身份验证的便利性。reCAPTCHA 短信收费欺诈防护会过滤短信流量。在您发送短信之前,reCAPTCHA 短信收费欺诈防护功能会为您提供一个风险评分,指示该手机号码出现短信收费欺诈的可能性。根据此得分,您可以允许或屏蔽欺诈性短信,然后再将其发送到您的短信服务提供商。

准备工作

  • 为 reCAPTCHA 准备好环境
  • 为您的 Google Cloud 项目启用 reCAPTCHA 短信收费欺诈防护:

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

      前往 reCAPTCHA

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

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

    3. 点击 设置

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

      1. 账号卫士窗格中,点击启用
      2. Configure account Defender 对话框中,点击 Enable
    5. SMS Toll Fraud Protection 窗格中,点击 Configure

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

    reCAPTCHA 短信收费欺诈防护启用设置可能需要几分钟时间才能传播到我们的系统。在功能启用情况传播到我们的系统后,您应该会开始在评估过程中收到与 reCAPTCHA 短信收费欺诈防护相关的响应。

  • 为您的网站移动应用创建基于得分的密钥。

配置 reCAPTCHA 短信收费欺诈防护

如需在网站或移动应用上配置 reCAPTCHA 短信收费欺诈防护,请执行以下操作:

  1. 在您的网站或移动应用中集成 reCAPTCHA

  2. 使用手机号码创建评估

  3. 为评估添加注释

集成 reCAPTCHA

如需在网站或移动应用中集成 reCAPTCHA,请执行以下操作之一:

使用手机号码创建评估

借助 execute() 函数生成的令牌,使用 reCAPTCHA 客户端库或后端中的 REST API 创建评估。

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

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

  • 设置对 reCAPTCHA 的身份验证。

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

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

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

    客户端库

    使用以下资源:

  • 选择不经常被用户更改的稳定帐号标识符 accountId,并通过 projects.assessments.create 方法将其提供给评估。对于与同一用户相关的所有事件,这个稳定的账号标识符应该具有相同的值。您可以提供以下内容作为帐号标识符:

    用户标识符

    如果每个帐号都可以与稳定的用户名、电子邮件地址或手机号码相关联,则可以将其用作 accountId。在您提供此类跨网站标识符(可在各网站之间重复使用的标识符)时,reCAPTCHA 会标记存在滥用行为的帐号标识符并利用与这些标识符相关的跨网站滥用模式,从而根据跨网站模型,利用这些信息来加强对您的用户帐号的保护。

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

    经过哈希处理或加密

    如果您没有与每个帐号唯一关联的内部用户 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 分钟内或成功验证手机号码后为评估添加注释。

如需为评估添加注释,您可以使用评估 ID 向 projects.assessments.annotate 方法发送请求。在该请求正文的 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) 和一个空响应。

后续步骤