本文說明如何使用 reCAPTCHA 簡訊防護功能,偵測並防範垃圾簡訊攻擊。如果貴商家採用簡訊進行雙重驗證 (2FA) 或電話號碼驗證,就可能成為簡訊費用詐欺的目標。
簡訊驗證機制 (雙重驗證和登入) 是登入和註冊安全性的業界標準,但無法防範簡訊費用詐欺或垃圾簡訊詐欺。在您傳送簡訊前,reCAPTCHA 簡訊防護功能會提供風險分數,指出該電話號碼發生簡訊費用詐欺的可能性。根據這個分數,您可以在詐欺簡訊傳送給簡訊服務供應商之前,允許或封鎖這類訊息。
與 reCAPTCHA 全球分數相比,reCAPTCHA SMS defense 風險分數的運作方式相反。reCAPTCHA 簡訊防護風險分數為 0.0,表示簡訊費用詐欺發生的可能性很低;風險分數為 1.0,表示簡訊費用詐欺發生的可能性很高。如要進一步瞭解 reCAPTCHA 分數,請參閱「解讀網站評估結果」。如果您使用 Firebase Authentication 或 Identity Platform,請參閱 Identity Platform 說明文件。
詳情請參閱 reCAPTCHA SMS defense 網誌。
事前準備
請根據您是否為 reCAPTCHA 現有使用者,按照適當分頁中的操作說明進行:
現有 reCAPTCHA 使用者
如果您是 reCAPTCHA 現有使用者,請在 Google Cloud 專案中啟用 reCAPTCHA SMS defense:
- 前往 Google Cloud 控制台的 reCAPTCHA 頁面。 
- 確認資源選取器中顯示專案名稱。 - 如果沒有看到專案名稱,請按一下資源選取器,然後選取專案。 
- 按一下「設定」。 
- 在「簡訊防禦」窗格中,按一下「設定」。 
- 按一下「啟用」切換鈕,然後按一下「儲存」。 - 啟用 reCAPTCHA SMS defense 時,如果帳戶防護工具尚未啟用,系統會一併啟用。 - 啟用 reCAPTCHA SMS defense 後,系統可能需要幾分鐘才能套用變更。功能啟用設定傳播至我們的系統後,您應該會開始在評估中收到與 reCAPTCHA 簡訊防護相關的回應。 
新 reCAPTCHA 使用者
如果您是 reCAPTCHA 新手,請按照下列步驟操作:
- 
如要在網站或行動應用程式上使用 reCAPTCHA 簡訊防護功能,請按照下列步驟整合 reCAPTCHA: 網站行動應用程式- 為行動應用程式建立以分數為準的驗證碼。
- 將 reCAPTCHA 整合至 iOS 應用程式或 Android 應用程式
 
- 在 Google Cloud 專案中啟用 reCAPTCHA SMS defense:
- 前往 Google Cloud 控制台的 reCAPTCHA 頁面。 
- 確認資源選取器中顯示專案名稱。 - 如果沒有看到專案名稱,請按一下資源選取器,然後選取專案。 
- 按一下「設定」。 
- 在「簡訊防禦」窗格中,按一下「設定」。 
- 按一下「啟用」切換鈕,然後按一下「儲存」。 - 啟用 reCAPTCHA SMS defense 時,如果帳戶防護工具尚未啟用,系統會一併啟用。 - 啟用 reCAPTCHA SMS defense 後,系統可能需要幾分鐘才能套用變更。功能啟用設定傳播至我們的系統後,您應該會開始在評估中收到與 reCAPTCHA 簡訊防護相關的回應。 
 
使用電話號碼建立評估
如要使用 reCAPTCHA 防範垃圾簡訊,請使用 reCAPTCHA 用戶端程式庫或後端的 REST API,透過 execute() 函式產生的權杖和電話號碼建立評估作業。
本文說明如何使用 REST API 建立評估。如要瞭解如何使用用戶端程式庫建立評估,請參閱建立評估。
建立評估前,請先完成下列步驟:
- 設定 reCAPTCHA 驗證。 - 可選用的驗證方法取決於 reCAPTCHA 的設定環境。下表可協助您選擇適當的驗證方法和支援的介面,以設定驗證: - 環境 - 介面 - 驗證方式 - Google Cloud - REST
- 用戶端程式庫
 - 使用附加的服務帳戶。 - 地端部署或其他雲端服務供應商 - REST - 使用 API 金鑰或 Workload Identity 聯盟。 - 如要使用 API 金鑰,建議套用 API 金鑰限制,確保 API 金鑰安全無虞。 - 用戶端程式庫 - 使用下列設定: - 如果是 Python 或 Java,請使用 API 金鑰或 Workload Identity Federation。
						如要使用 API 金鑰,建議套用 API 金鑰限制,確保 API 金鑰安全無虞。 
- 其他語言請使用 Workload Identity 聯盟。
 
- 選擇使用者不會經常變更的穩定帳戶 ID - accountId,並在- projects.assessments.create方法中提供給評估服務。對於與同一位使用者相關的所有事件,這個穩定帳戶 ID 的值應相同。您可以提供下列任一項做為帳戶 ID:- 使用者 ID- 如果每個帳戶都能與穩定的使用者名稱、電子郵件地址或電話號碼建立專屬關聯,您就可以將這些資訊做為 - accountId。當您提供這類跨網站 ID (可在不同網站重複使用的 ID) 時,reCAPTCHA 會使用這項資訊,根據跨網站模型標記濫用帳戶 ID,並運用與這些 ID 相關的跨網站濫用模式知識,提升使用者帳戶的防護能力。- 或者,如果每個帳戶都有專屬的內部使用者 ID,您可以將該 ID 提供為 - accountId。- 雜湊處理或加密- 如果沒有與每個帳戶唯一相關聯的內部使用者 ID,您可以將任何穩定 ID 轉換為不透明的網站專屬帳戶 ID。reCAPTCHA 帳戶防護功能仍需使用這個 ID 瞭解使用者活動模式並偵測異常行為,但不會與其他網站共用。 - 挑選任何穩定的帳戶 ID,並使用加密或雜湊處理方式,在傳送至 reCAPTCHA 之前將其設為不透明: - 加密 (建議):使用確定性加密方法加密帳戶 ID,產生穩定的密文。如需詳細操作說明,請參閱以決定性方式加密資料。選擇對稱加密而非雜湊處理時,您不需要保留使用者 ID 與對應不透明使用者 ID 之間的對應關係。解密 reCAPTCHA 傳回的不透明 ID,將其轉換為使用者 ID。 
- 雜湊處理:建議使用 SHA256-HMAC 方法,並搭配您選擇的自訂鹽值,對帳戶 ID 進行雜湊處理。由於雜湊值只能單向轉換,您必須保留產生的雜湊值與使用者 ID 之間的對應關係,才能將傳回的雜湊帳戶 ID 對應回原始帳戶。 
 
在 projects.assessments.create 方法中,新增 accountId 參數和 E.164 格式的電話號碼,做為評估中的 UserId,以進行驗證。
使用任何要求資料之前,請先替換以下項目:
- PROJECT_ID:您的 Google Cloud 專案 ID。
- TOKEN:從 grecaptcha.enterprise.execute()呼叫傳回的權杖。
- KEY_ID:您在網站上安裝的分數型金鑰。
- ACCOUNT_ID:網站專屬的使用者帳戶 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",
  "phoneFraudAssessment": {
    "smsTollFraudVerdict": {
      "risk": 0.3
    }
  }
}
您收到的回應會在 phoneFraudAssessment.smsTollFraudVerdict 欄位中包含 risk 分數。分數越高,電話號碼越有可能有風險;分數越低,電話號碼越有可能屬於正當活動。
您必須為根據評估結果採取的行動負責。
如要進行最簡單的整合,您可以設定門檻,phoneFraudAssessment.smsTollFraudVerdict.risk藉此協助您做出決策。
為評估結果加上註解
為追蹤簡訊流量及提升詐欺偵測準確度,您必須在簡訊傳送後或電話號碼驗證成功後 10 分鐘內,為評估結果加上註解。
如要加註評估,請將要求傳送至 projects.assessments.annotate 方法,並提供評估 ID。在該要求的內文中,以 E.164 格式在 phoneAuthenticationEvent 欄位中加入電話號碼。
如要為評估作業加上註解,請按照下列步驟操作:
- 視用途而定,決定要在要求 JSON 主體中新增的資訊和標籤。 - 下表列出可用於註解事件的標籤和值: - 標籤 - 說明 - 要求範例 - reasons- 這是必要旗標,支援評估作業的標籤。 - 在活動發生後幾秒或幾分鐘內,於 - reasons標籤中提供即時活動詳細資料,因為這些資料會影響即時偵測。- 可能的值包括: - INITIATED_TWO_FACTOR:系統會透過簡訊傳送驗證碼。
- PASSED_TWO_FACTOR:驗證碼已成功通過驗證。
- FAILED_TWO_FACTOR:驗證碼無效。
 - { "reasons": ["INITIATED_TWO_FACTOR"], "phoneAuthenticationEvent": { "phoneNumber": "+18005550175" } }- annotation- (選用步驟) 用來指出評估作業是否合法。 - 提供登入和註冊事件的相關事實,以驗證或修正 - annotation標籤中的風險評估。- 可能的值: - LEGITIMATE或- FRAUDULENT。- 建議您在事件發生後幾秒或幾分鐘內傳送這項資訊,因為這會影響即時偵測。 - { "annotation": "LEGITIMATE" }
- 使用適當的標籤建立註解要求。 <0x0A - 使用任何要求資料之前,請先替換以下項目: - 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) 和空白回應。 
- ASSESSMENT_ID:從