本文說明如何透過現有的 Google Cloud Fraud Defense 整合設定驗證政策。
驗證政策可讓您根據自訂規則,選擇性觸發 CAPTCHA 驗證。這些規則會根據風險評分、IP 位址、使用者代理程式、ASN、地理區域或已驗證的機器人 (AI 代理) 身分,決定何時顯示 Fraud Defense 驗證。
您可以搭配下列建議功能使用驗證政策:
- AutoExecute 設定:簡化用戶端應用程式的 JavaScript 整合。
- 驗證問題:根據驗證問題規則,在必要時觸發使用者驗證。Fraud Defense 支援下列驗證問題類型:
- 視覺驗證問題:要求使用者根據提示選取圖片。 根據預設,如果設定規則時選取了驗證選項,系統會選取視覺驗證。
- 音訊驗證:要求使用者辨識語音音訊提示,做為無障礙替代方案。
- QR code 挑戰:要求使用者以行動裝置掃描 QR code 來完成挑戰。您的通用金鑰必須在許可清單中,才能使用這項功能。如要將通用金鑰加入許可清單,請與 Fraud Defense 團隊聯絡 (fraud-defense@google.com),並提供通用金鑰。
事前準備
- 準備 Google Cloud Fraud Defense 環境。
- 確認 Google Cloud 專案已啟用計費功能。您可以使用信用卡或現有的 Google Cloud 專案帳單 ID 啟用計費功能。如需帳單相關協助,請聯絡 Cloud Billing 支援團隊。
為專案建立或找出通用金鑰。如要建立金鑰,請參閱「建立通用金鑰」。或者,您也可以複製現有通用金鑰的 ID,方法如下:
如要從 Google Cloud 控制台複製現有金鑰的 ID,請按照下列步驟操作:
前往 Google Cloud 控制台的「Google Cloud Fraud Defense」頁面。
在「Keys」(金鑰) 清單中,找出要複製的金鑰,然後按一下 「Copy to clipboard」(複製到剪貼簿)。
如要使用 REST API 複製現有機碼的 ID,請呼叫
projects.keys.list方法。如要使用 gcloud CLI 複製現有金鑰的 ID,請執行
gcloud recaptcha keys list指令。
規劃 Fraud Defense 整合時,請找出要保護的使用者動作 (例如
login、signup或password_reset),以及網站上觸發這些動作的網頁。如果您使用 AutoExecute 設定,請確認這些動作與protected_endpoint_group中指定的動作名稱一致。將 Fraud Defense 整合至網頁。建議您使用 Fraud Defense AutoExecute 設定。如需一般設定操作說明,請參閱「在網站上安裝通用金鑰」。
Fraud Defense 政策設定總覽
您可以透過 Fraud Defense 政策設定,自訂 Fraud Defense 防護機制的行為。您可以使用 challenge_rule_groups 區段設定驗證政策。
您可以使用 Google Cloud 控制台、gcloud CLI 或 reCAPTCHA Enterprise REST API,查看及更新政策設定。
控制台
如要在 Google Cloud 控制台查看或更新政策設定,請按照下列步驟操作:
前往 Google Cloud 控制台的「Fraud Defense」頁面。
確認已在資源選取器中選取專案。
在「reCAPTCHA keys」(reCAPTCHA 金鑰) 表格中,按一下要設定驗證政策的金鑰名稱。
在「Key details」(金鑰詳細資料) 頁面中,前往「Policy」(政策) 分頁。
在「Rule groups」(規則群組) 區段中,您可以查看、新增或編輯驗證問題規則和條件運算式。
按一下 [儲存]。
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 或留空,規則會無條件套用。此外,challenge 和 no_challenge 欄位互斥,每項規則都必須包含其中一個欄位。
規則評估順序
系統會由上至下依序評估規則群組及其內部規則,並套用第一項相符的規則。如果沒有與互動相符的群組和規則,評估作業預設會使用標準評估,不會顯示驗證問題,但會為要求產生風險分數。
驗證問題難度
觸發挑戰時,可以指定難度等級。如需有效難度值的完整清單,請參閱 ChallengeSecurityPreference API 參考資料。
條件語法
condition 欄位為選填字串,格式為一般運算語言 (CEL) 運算式。如果未指定 condition 或留空,規則會無條件套用。CEL 提供標準的 C 語言運算子,包括關係運算子 (<、<=、>、>=、==、!=)、算術運算子 (+、-、/、*、%)、邏輯運算子 (!、&&、||) 和容器運算子 ([]、in)。CEL 支援常見的基本資料類型 (bool、int、uint、double、string)、基本容器類型 (lists、messages) 和常數 (例如 true、1、0.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)。 |
region_code |
string |
與要求位置相關聯的 Unicode CLDR 區域代碼 (根據 ISO 3166-1 alpha-2),例如 "US"、"CA" 或 "FR"。 |
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.5、user_ip_address == "192.0.2.1"、region_code == "US" 和 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) -> intsize(list) -> intstring.size() -> intlist.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: {}
注意:這項規則與 Fraud Defense 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: {}
後續步驟
- 如要評估 reCAPTCHA 回應權杖,請參閱「建立網站評估」。