啟用或停用電子郵件列舉保護功能
本指南說明電子郵件清單保護功能,並說明如何啟用及停用這項功能。如果您是在 2023 年 9 月 15 日當天或之後建立專案,系統會預設啟用電子郵件列舉保護功能。
總覽
電子郵件列舉是一種暴力攻擊,惡意人士會嘗試將電子郵件地址傳遞至 API,並檢查回應,藉此猜測或確認系統中的使用者。
如果未啟用電子郵件列舉防護功能,Identity Platform 會傳回可供電子郵件列舉攻擊利用的資訊:
使用者嘗試登入的電子郵件地址不存在於系統中。Identity Platform 傳回
EMAIL_NOT_FOUND
錯誤。嘗試使用系統中已有的電子郵件地址註冊。Identity Platform 傳回
EMAIL_EXISTS
錯誤。
您可以使用 Identity Platform 的電子郵件列舉保護功能,保護應用程式中的使用者帳戶免受這類攻擊。
啟用電子郵件列舉防護功能後,專案會顯示以下行為:
fetchSignInForEmail
API 會失敗。在 Android 10.18.0 版、iOS 10.18.0 版和網頁版 10.6.0 版之前,無法將匿名驗證使用者與電子郵件地址建立連結。在所有平台上呼叫
createAuthUri
REST API 或fetchSignInMethodsForEmail
用戶端 SDK 方法時,系統將不再傳回指定電子郵件地址的登入方法清單。使用者必須先驗證新地址,才能變更電子郵件地址。舉例來說,您無法再使用
update
REST API、setAccountInfo
REST API 或updateEmail
用戶端 SDK 方法,在所有平台上變更使用者的電子郵件地址。您可以改用
verifyBeforeUpdateEmail
(適用於網頁版和 Android) 或sendEmailVerification(beforeUpdatingEmail:)
(適用於 iOS)。您無法再使用
setAccountInfo
REST API 將電子郵件/密碼提供者連結至現有使用者帳戶。您無法再在任何平台上使用linkWithCredential
用戶端 SDK 方法搭配EmailAuthCredential
。請改用 REST APIsignUp
,在idToken
欄位和email
、password
欄位中傳遞使用者的 ID 權杖。移除電子郵件驗證流程的錯誤回應,例如透過呼叫
sendOobCode
REST API 以VERIFY_AND_CHANGE_EMAIL
或PASSWORD_RESET
要求類型啟動的流程,以及在呼叫verifyBeforeUpdateEmail
(適用於網頁版和 Android)、sendEmailVerification(beforeUpdatingEmail:)
(適用於 iOS) 或sendPasswordResetEmail
用戶端 SDK 方法 (適用於所有平台) 時。當您提出重設密碼要求時,只有在電子郵件地址已存在的情況下,系統才會傳送驗證電子郵件;當您提出變更電子郵件地址要求時,只有在電子郵件地址不存在的情況下,系統才會傳送驗證電子郵件。在上述兩種情況下,系統都不會顯示特定錯誤訊息,指出電子郵件未送達。
建議您不要允許使用者在未經過電子郵件驗證流程的情況下註冊。
無效的登入情況會傳回
INVALID_LOGIN_CREDENTIALS
錯誤回應。無效的註冊案例會繼續傳回EMAIL_EXISTS
錯誤,請參閱下一節的建議。
如果您的應用程式依賴電子郵件列舉保護機制所變更的任何行為,目前可以停用這項機制。不過,我們不建議長期使用這種做法,請參閱下一個章節。
安全性建議
執行帳戶盜用攻擊最常見的方法之一,就是使用遭洩漏或容易猜測的憑證,執行憑證填充攻擊。電子郵件列舉功能也可能會用於取得使用者的機密資訊,或對使用者發動網路釣魚攻擊。基於這些原因,Google 建議您使用電子郵件列舉防護功能,保護應用程式免於遭受這類攻擊。
如果您是在 2023 年 9 月 15 日當天或之後建立專案,系統會預設啟用電子郵件列舉保護功能。建議您啟用電子郵件列舉保護功能,並避免依賴本指南前述所列的任何行為。
如果您在 2023 年 9 月 15 日前建立專案,系統不會自動啟用電子郵件列舉保護功能。
如果您的應用程式不依賴本指南前述的任何行為,建議您立即啟用電子郵件列舉保護功能。
如果您的應用程式會依賴上述任何行為,建議您開始改用其他方法,並盡快啟用電子郵件列舉保護功能。
除了使用電子郵件列舉保護功能之外,建議您採取措施,防止濫用專案的註冊端點,導致持續傳回 EMAIL_EXISTS
錯誤。以下提供幾種方法:
啟用電子郵件列舉防護
如要啟用電子郵件列舉保護功能,請按照下列步驟操作:
Firebase 控制台
前往 Firebase 控制台的「Firebase Auth Settings」頁面。
在導覽窗格中,選取「使用者動作」。
選取「電子郵件列舉防護 (建議)」。
按一下 [儲存]。
Node.js
安裝 Admin SDK。
如要啟用電子郵件列舉保護功能,請使用下列其中一種方法:
專案層級的保護措施:
import { getAuth } from 'firebase-admin/auth'; getAuth().projectConfigManager().updateProjectConfig( { emailPrivacyConfig: { enableImprovedEmailPrivacy: true, }, } );
租用戶層級保護措施:
import { getAuth } from 'firebase-admin/auth'; getAuth().tenantConfigManager().updateTenant(TENANT_ID, { emailPrivacyConfig: { enableImprovedEmailPrivacy: true, }, } );
將
TENANT_ID
替換為您要啟用電子郵件列舉保護功能的租用戶 ID。
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 控制台的「Firebase Auth Settings」頁面。
在導覽窗格中,選取「使用者動作」。
清除「電子郵件列舉防護 (建議)」。
按一下 [儲存]。
Node.js
安裝 Admin SDK。
如要停用電子郵件列舉保護功能,請使用下列其中一種做法:
專案層級的保護措施:
import { getAuth } from 'firebase-admin/auth'; getAuth().projectConfigManager().updateProjectConfig( { emailPrivacyConfig: { enableImprovedEmailPrivacy: false, }, } );
租用戶層級保護措施:
import { getAuth } from 'firebase-admin/auth'; getAuth().tenantConfigManager().updateTenant(TENANT_ID, { emailPrivacyConfig: { enableImprovedEmailPrivacy: false, }, } );
將
TENANT_ID
替換為要停用電子郵件列舉保護功能的租用戶 ID。
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\"}]}}"
}