設定驗證問題政策

本文說明如何透過現有的 Google Cloud Fraud Defense 整合服務設定驗證政策。

驗證政策可讓您根據自訂規則,選擇性地觸發 CAPTCHA 驗證問題。系統會根據風險分數、IP 位址、使用者代理程式、ASN 或已驗證的機器人 (AI 代理程式) 身分,決定何時顯示 Fraud Defense 驗證。

您可以搭配下列建議功能使用驗證政策:

  • AutoExecute 設定: 簡化用戶端應用程式的 JavaScript 整合程序。
  • 挑戰:在挑戰規則要求時,觸發使用者驗證。Fraud Defense 支援下列驗證類型:
    • 視覺挑戰:要求使用者根據提示選取圖片。 根據預設,如果設定規則時選取了驗證選項,系統會選取視覺驗證。
    • 語音挑戰:要求使用者辨識語音音訊提示,做為無障礙替代方案。
    • QR code 挑戰:請使用者使用行動裝置掃描 QR code 來解決挑戰。您的通用金鑰必須在許可清單中,才能使用這項功能。如要將通用金鑰加入許可清單,請傳送電子郵件至 fraud-defense@google.com 與 Fraud Defense 團隊聯絡,並提供您的通用金鑰。

事前準備

  1. 準備 Google Cloud Fraud Defense 環境
  2. 確認您已為 Google Cloud 專案啟用計費功能。你可以使用信用卡或現有的 Google Cloud 專案帳單 ID 啟用帳單。如需帳單方面的協助,請與 Cloud Billing 支援團隊聯絡。
  3. 為專案建立或找出通用金鑰。如要建立金鑰,請參閱「建立通用金鑰」。或者,您也可以完成下列任一步驟,複製現有通用金鑰的 ID:

    • 如要從 Google Cloud 控制台複製現有金鑰的 ID,請按照下列步驟操作:

      1. 前往 Google Cloud 控制台的「Google Cloud Fraud Defense」頁面。

        前往 Fraud Defense

      2. 在「reCAPTCHA 金鑰」清單中,找到要複製的金鑰,然後按一下「複製到剪貼簿」圖示

    • 如要使用 REST API 複製現有金鑰的 ID,請呼叫 projects.keys.list 方法。

    • 如要使用 gcloud CLI 複製現有金鑰的 ID,請執行 gcloud recaptcha keys list 指令。

  4. 規劃 Fraud Defense 整合作業時,請先找出要保護的使用者動作 (例如 loginsignuppassword_reset),以及網站上會觸發這些動作的網頁。如果您使用 AutoExecute 設定,請確保這些動作與 protected_endpoint_group 中指定的動作名稱一致。

  5. 將 Fraud Defense 整合至網頁。建議您使用 Fraud Defense AutoExecute 設定。如需一般設定操作說明,請參閱「在網站上安裝通用金鑰」。

Fraud Defense 政策設定總覽

您可以透過 Fraud Defense 政策設定,自訂 Fraud Defense 保護機制的行為。您可以使用 challenge_rule_groups 區段設定驗證政策。

您可以使用 Google Cloud 控制台、gcloud CLI 或 reCAPTCHA Enterprise REST API,查看及更新政策設定。

控制台

如要在 Google Cloud 控制台中查看或更新政策設定,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「Fraud Defense」(詐欺防禦) 頁面。

    前往 Fraud Defense

  2. 確認已在資源選取器中選取專案。

  3. 在「reCAPTCHA 金鑰」表格中,按一下要設定驗證政策的金鑰名稱。

  4. 在「Key details」(重要詳細資料) 頁面中,前往「Policy」(政策) 分頁標籤。

  5. 在「規則群組」部分,您可以查看、新增或編輯驗證規則和條件運算式。

  6. 按一下 [儲存]

gcloud

如要更新金鑰的政策設定,請執行 gcloud alpha recaptcha policies update 指令:

gcloud alpha recaptcha policies update --key=KEY_ID --policy=POLICY.yaml

如要查看金鑰的目前政策設定,請執行 gcloud alpha recaptcha policies describe 指令:

gcloud alpha recaptcha policies describe --key=KEY_ID

REST API

如要更新金鑰的政策設定,請呼叫 projects.keys.updatePolicy 方法:

PATCH https://recaptchaenterprise.googleapis.com/v1/projects/PROJECT_ID/keys/KEY_ID/policy

{
  "clientSettings": {
    "allowedDomains": [
      "example.com"
    ]
  },
  "challengeRuleGroups": [
    {
      "actions": ["login"],
      "challengeRules": [
        {
          "condition": "score < 0.7",
          "challenge": {}
        }
      ]
    }
  ]
}

如要查看金鑰目前的政策設定,請呼叫 projects.keys.getPolicy 方法:

GET https://recaptchaenterprise.googleapis.com/v1/projects/PROJECT_ID/keys/KEY_ID/policy

政策設定會使用 YAML 格式 (適用於 Google Cloud CLI) 和 JSON 格式 (適用於 REST API)。如要查看 challenge_rule_groups 區段的完整結構定義,請參閱「設定驗證政策」。

如需不同用途的範例,請參閱「挑戰規則設定範例」。

設定驗證問題政策

您可以在 Fraud Defense 政策設定的 challenge_rule_groups 區段中設定驗證政策。如果您已有包含網域資訊的 client_settings 政策,可以更新政策,加入驗證政策規則。

challenge_rule_groups 區段的結構如下:

challenge_rule_groups:
  - actions: [string, ...]
    challenge_rules:
      - condition: string
        challenge:
          # difficulty is optional: USABILITY | BALANCE (default) | SECURITY
          difficulty: BALANCE
        # OR no_challenge: {}
      - condition: string
        challenge:
          difficulty: BALANCE
        # OR no_challenge: {}

在每項競賽項目規則中,condition 欄位為選填欄位。如果 condition 未指定或空白,系統會無條件套用規則。此外,challengeno_challenge 欄位互斥,且每個規則都必須包含其中一個欄位。

規則評估順序

系統會由上至下依序評估規則群組及其內部規則,並套用第一項相符的規則。如果沒有與互動相符的群組和規則,評估作業預設會使用標準評估,不會顯示驗證問題,但會為要求產生風險分數。

驗證問題難度等級

觸發挑戰時,您可以指定難度。如需有效難度值的完整清單,請參閱 ChallengeSecurityPreference API 參考資料。

條件語法

condition」欄位為選填字串,格式為一般運算語言 (CEL) 運算式。如果未指定或留空 condition,系統會無條件套用規則。CEL 提供標準 C 語言風格的運算子,包括關係 (<<=>>===!=)、算術 (+-/*%)、邏輯 (!&&||) 和容器 ([]in) 運算子。CEL 支援常見的基本資料型別 (boolintuintdoublestring)、基本容器型別 (listsmessages) 和常數 (例如 true10.5"hello"[1, 2, 3])。

在執行階段,您可以存取下列 Fraud Defense 變數:

變數 類型 說明
score double Fraud Defense 機器人分數。
user_ip_address string 提出要求的使用者 IP 位址 (IPv4 或 IPv6)。
user_agent string 提出要求的使用者代理程式。
user_asn int 提出要求的使用者自治系統編號 (ASN)。省略 AS 前置字串 (例如,使用 12345 而不是 AS12345)。
verified_bots list(Bot) Fraud Defense 偵測到的已驗證自動檢索器或代理程式清單 (例如搜尋引擎索引器、AI 搜尋助理和合作夥伴內容擷取器)。

系統定義了下列額外的非原始型別。如需完整的值清單,請參閱「機器人」。

message Bot {
  name [string] - the name of the bot
  bot_type [BotType] - the type of automated agent
}

如要進一步瞭解可能的 name 值,請參閱 Bot API 參考資料。如要進一步瞭解有效的 bot_type 列舉值,請參閱 BotType API 參考資料。

在 Fraud Defense 挑戰政策中,您可以使用上述任一變數產生布林運算式。舉例來說,score > 0.5user_ip_address == "192.0.2.1"user_asn == 12345 都是有效的條件運算式,會評估為布林值。請注意,由於 user_asn 是整數類型,檢查 ASN 時必須省略 AS 前置字元。

您可以在 Fraud Defense 驗證政策條件中使用下列函式:

名稱 簽章 說明
contains string.contains(string) -> bool 檢查字串運算元是否包含子字串。
startsWith string.startsWith(string) -> bool 檢查字串運算元是否以指定前置字串開頭。
endsWith string.endsWith(string) -> bool 檢查字串運算元是否以指定字尾結尾。
size size(string) -> int
size(list) -> int
string.size() -> int
list.size() -> int
傳回字串的大小 (程式碼點數) 或清單的大小 (元素數)。

瞭解函式是 CEL 內建的巨集樣式。可用的理解方式如下:

名稱 簽章 說明 範例
has has(message.field) -> bool 檢查欄位是否可用。 has(verified_bots[0].name)
all list(A).all(A, predicate(A) -> bool) -> bool 檢查清單 e 中的所有元素 x 是否符合述詞 p [1, 2, 3].all(x, x > 0)
exists list(A).exists(A, predicate(A) -> bool) -> bool 檢查清單 e 中的任何元素 x 是否符合述詞 p [1, 2, 3].exists(i, i % 2 != 0)
exists_one list(A).exists_one(A, predicate(A)) -> bool 檢查清單 e 中是否只有一個元素 x 符合述詞 p [1, 2, 2].exists_one(i, i < 2)

驗證問題規則設定範例

本節包含有效的驗證規則設定範例。

對所有低分要求提出異議

challenge_rule_groups:
  - actions: ['*']
    challenge_rules:
      - condition: 'score < 0.5'
        challenge: {}

針對所有低分要求選取高摩擦係數的挑戰

challenge_rule_groups:
  - actions: ['*']
    challenge_rules:
      - condition: 'score < 0.5'
        challenge:
          difficulty: 'SECURITY'

對分數偏低的特定動作提出異議

challenge_rule_groups:
  - actions: ['login', 'signup']
    challenge_rules:
      - condition: 'score < 0.5'
        challenge: {}

為不同動作設定不同的規則門檻

challenge_rule_groups:
  - actions: ['login']
    challenge_rules:
      - condition: 'score < 0.5'
        challenge: {}
  - actions: ['signup']
    challenge_rules:
      - condition: 'score < 0.7'
        challenge: {}

不要向許可清單中的 IP 位址顯示驗證問題

challenge_rule_groups:
  - actions: ['*']
    challenge_rules:
      - condition: 'user_ip_address in ["123.255.255.001", "123.255.255.002"]'
        no_challenge: {}

注意:這項規則與詐欺防禦 IP 許可清單功能不同。

不要向 IP 位址子網路顯示驗證問題

challenge_rule_groups:
  - actions: ['*']
    challenge_rules:
      - condition: 'user_ip_address.startsWith("123.255.255")'
        no_challenge: {}

不要對特定 ASN 的要求顯示驗證

challenge_rule_groups:
  - actions: ['*']
    challenge_rules:
      # Note that ASNs must be specified as integers without the AS prefix (e.g., 12345 instead of AS12345)
      - condition: 'user_asn in [12345, 67890]'
        no_challenge: {}

不要向 Google 服務專員顯示驗證問題

challenge_rule_groups:
  - actions: ['*']
    challenge_rules:
      - condition: 'verified_bots.exists(e, e.name == "google-agent")'
        no_challenge: {}

根據複雜條件顯示挑戰

challenge_rule_groups:
  - actions: ['*']
    challenge_rules:
      - condition: '(user_agent.contains("Chrome/143") && score < 0.5) || (user_agent.contains("Chrome/149") && score < 0.7)'
        challenge: {}

後續步驟