啟用或停用電子郵件列舉保護措施
本指南說明電子郵件列舉保護功能,以及如何啟用和停用這項功能。如果您是在 2023 年 9 月 15 日當天或之後建立專案,系統預設會啟用電子郵件列舉防護功能。
總覽
電子郵件列舉是一種暴力攻擊,惡意行為者會將電子郵件地址傳遞至 API 並檢查回應,藉此猜測或確認系統中的使用者。
如果沒有電子郵件列舉防護機制,Identity Platform 會傳回可供電子郵件列舉攻擊利用的資訊:
嘗試登入的電子郵件地址不存在於系統中。Identity Platform 傳回
EMAIL_NOT_FOUND錯誤。嘗試使用系統中已有的電子郵件地址註冊。Identity Platform 傳回
EMAIL_EXISTS錯誤。
您可以運用 Identity Platform 的電子郵件列舉防護功能,保護應用程式中的使用者帳戶免於這類攻擊。
啟用電子郵件列舉防護後,專案會出現下列行為:
fetchSignInForEmailAPI 會失敗。如果 SDK 版本低於 Android 22.3.0、iOS 10.18.0 和網頁 10.6.0,也無法將匿名驗證使用者與電子郵件地址建立連結。在所有平台上呼叫
createAuthUriREST API 或fetchSignInMethodsForEmail用戶端 SDK 方法時,系統不會再傳回指定電子郵件地址的登入方法清單。使用者必須先驗證新電子郵件地址,才能變更地址。舉例來說,您無法再透過
updateREST API、setAccountInfoREST API 或所有平台上的updateEmail用戶端 SDK 方法變更使用者電子郵件地址。您可以改用
verifyBeforeUpdateEmail(適用於網頁和 Android) 或sendEmailVerification(beforeUpdatingEmail:)(適用於 iOS)。您無法再使用
setAccountInfoREST API,將電子郵件/密碼供應商連結至現有使用者帳戶。您無法再於任何平台使用linkWithCredential用戶端 SDK 方法搭配EmailAuthCredential。請改用 REST APIsignUp,在idToken欄位中傳遞使用者的 ID 權杖,並傳遞email和password欄位來連結。移除電子郵件驗證流程的錯誤回應,包括透過使用
VERIFY_AND_CHANGE_EMAIL或PASSWORD_RESET要求類型呼叫sendOobCodeREST API 啟動的流程,以及呼叫 Web 和 Android 的verifyBeforeUpdateEmail、iOS 的sendEmailVerification(beforeUpdatingEmail:)或所有平台的sendPasswordResetEmail啟動的流程。當您提出密碼重設要求時,系統只會在電子郵件地址存在的情況下傳送驗證電子郵件;當您提出電子郵件地址變更要求時,系統只會在電子郵件地址不存在的情況下傳送驗證電子郵件。在這兩種情況下,系統都不會顯示特定錯誤訊息,指出電子郵件未傳送。
建議您不要允許使用者在沒有電子郵件驗證流程的情況下註冊。
如果登入無效,系統會傳回
INVALID_LOGIN_CREDENTIALS錯誤回應。無效的註冊案例仍會傳回EMAIL_EXISTS錯誤,請參閱下一節的建議。
如果應用程式依賴電子郵件列舉保護機制變更的任何行為,可以停用這項機制。不過,從長遠來看,我們不建議這麼做,詳情請參閱下一節。
安全性建議
執行帳戶盜用攻擊最常見的方法之一,就是使用外洩或容易猜到的憑證,執行憑證填充攻擊。電子郵件列舉也可能用於取得使用者的私密資訊,或對使用者發動網路釣魚攻擊。基於上述原因,Google 建議使用電子郵件列舉防護功能,保護應用程式免於這類攻擊。
如果您是在 2023 年 9 月 15 日當天或之後建立專案,系統預設會啟用電子郵件列舉保護機制。建議您啟用電子郵件列舉保護機制,並避免依賴本指南稍早列出的任何行為。
如果您在 2023 年 9 月 15 日前建立專案,系統不會自動啟用電子郵件列舉保護機制。
如果您的應用程式不依賴本指南稍早所述的任何行為,建議您立即啟用電子郵件列舉保護機制。
如果您的應用程式依賴上述任何行為,建議您開始遷移,並盡快啟用電子郵件列舉保護措施。
除了使用電子郵件列舉保護機制,您也可以考慮採取措施,防止專案的註冊端點遭到濫用,並繼續傳回 EMAIL_EXISTS 錯誤。以下提供幾種做法:
啟用電子郵件列舉防護
如要啟用電子郵件列舉保護機制,請按照下列步驟操作:
Firebase 控制台
前往 Firebase 控制台的「Authentication Settings」(驗證設定) 頁面。
在「使用者帳戶管理」窗格中,選取「使用者動作」。
選取「電子郵件列舉防護 (建議)」。
按一下 [儲存]。
REST
在 Google Cloud 主控台中,使用
gcloud auth print-access-token指令列印專案 ID 的存取權杖:gcloud auth print-access-token --project=PROJECT_ID使用 Identity Toolkit API 為專案 ID 啟用電子郵件列舉保護機制:
curl -X PATCH -d "{'emailPrivacyConfig':{'enableImprovedEmailPrivacy':true}}" \ -H 'Authorization: Bearer ACCESS_TOKEN' \ -H 'Content-Type: application/json' -H 'X-Goog-User-Project: PROJECT_ID' \ "https://identitytoolkit.googleapis.com/admin/v2/projects/PROJECT_ID/config?updateMask=emailPrivacyConfig"
更改下列內容:
- ACCESS_TOKEN:先前產生的存取權杖
- PROJECT_ID:專案 ID
停用電子郵件列舉防護
如要停用電子郵件列舉保護措施,請按照下列步驟操作:
Firebase 控制台
前往 Firebase 控制台的「Authentication Settings」(驗證設定) 頁面。
在「使用者帳戶管理」窗格中,選取「使用者動作」。
取消勾選「電子郵件列舉防護 (建議)」。
按一下 [儲存]。
REST
在 Google Cloud 主控台中,使用
gcloud auth print-access-token指令列印專案 ID 的存取權杖:gcloud auth print-access-token --project=PROJECT_ID使用 Identity Toolkit API 停用電子郵件列舉保護機制:
curl -X PATCH -d "{'emailPrivacyConfig':{'enableImprovedEmailPrivacy':false}}" \ -H 'Authorization: Bearer ACCESS_TOKEN' \ -H 'Content-Type: application/json' -H 'X-Goog-User-Project: PROJECT_ID' \ "https://identitytoolkit.googleapis.com/admin/v2/projects/PROJECT_ID/config?updateMask=emailPrivacyConfig"
更改下列內容:
- ACCESS_TOKEN:先前產生的存取權杖
- PROJECT_ID:專案 ID
錯誤回應範例
如果使用者嘗試以錯誤的電子郵件地址或密碼登入,或是嘗試使用系統中已有的電子郵件地址註冊,Identity Platform 會傳回類似下列的錯誤:
{
"code": "auth/internal-error",
"message": "{\"error\":{\"code\":400,\"message\":\"INVALID_LOGIN_CREDENTIALS\",\"errors\":[{\"message\":\"INVALID_LOGIN_CREDENTIALS\",\"domain\":\"global\",\"reason\":\"invalid\"}]}}"
}