本文說明如何透過現有的 Google Cloud Fraud Defense 整合服務設定驗證政策。
驗證政策可讓您根據自訂規則,選擇性地觸發 CAPTCHA 驗證問題。系統會根據風險分數、IP 位址、使用者代理程式、ASN 或已驗證的機器人 (AI 代理程式) 身分,決定何時顯示 Fraud Defense 驗證。
您可以搭配下列建議功能使用驗證政策:
- AutoExecute 設定: 簡化用戶端應用程式的 JavaScript 整合程序。
- 挑戰:在挑戰規則要求時,觸發使用者驗證。Fraud Defense 支援下列驗證類型:
- 視覺挑戰:要求使用者根據提示選取圖片。 根據預設,如果設定規則時選取了驗證選項,系統會選取視覺驗證。
- 語音挑戰:要求使用者辨識語音音訊提示,做為無障礙替代方案。
- QR code 挑戰:請使用者使用行動裝置掃描 QR code 來解決挑戰。您的通用金鑰必須在許可清單中,才能使用這項功能。如要將通用金鑰加入許可清單,請傳送電子郵件至 fraud-defense@google.com 與 Fraud Defense 團隊聯絡,並提供您的通用金鑰。
事前準備
- 準備 Google Cloud Fraud Defense 環境。
- 確認您已為 Google Cloud 專案啟用計費功能。你可以使用信用卡或現有的 Google Cloud 專案帳單 ID 啟用帳單。如需帳單方面的協助,請與 Cloud Billing 支援團隊聯絡。
為專案建立或找出通用金鑰。如要建立金鑰,請參閱「建立通用金鑰」。或者,您也可以完成下列任一步驟,複製現有通用金鑰的 ID:
如要從 Google Cloud 控制台複製現有金鑰的 ID,請按照下列步驟操作:
前往 Google Cloud 控制台的「Google Cloud Fraud Defense」頁面。
在「reCAPTCHA 金鑰」清單中,找到要複製的金鑰,然後按一下「複製到剪貼簿」圖示 。
如要使用 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 金鑰」表格中,按一下要設定驗證政策的金鑰名稱。
在「Key details」(重要詳細資料) 頁面中,前往「Policy」(政策) 分頁標籤。
在「規則群組」部分,您可以查看、新增或編輯驗證規則和條件運算式。
按一下 [儲存]。
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)。 |
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" 和 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: {}
注意:這項規則與詐欺防禦 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 回應權杖,請參閱「為網站建立評估」。