Recca Chao 的 gitHub page

推廣網站開發,包含 Laravel 和 Kotlin 後端撰寫、自動化測試、讀書心得等。Taiwan Kotlin User Group 管理員。

View on GitHub

翻譯自

https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Forgot_Password_Cheat_Sheet.md


忘記密碼小抄

簡介

為了實現正確的使用者管理系統,系統會整合一個忘記密碼服務,允許使用者請求重設密碼。

儘管這個功能看起來簡單且易於實現,但卻是一個常見的漏洞來源,例如著名的使用者列舉攻擊

以下簡短指南可作為快速參考,以保護忘記密碼服務:

這份小抄專注於重設使用者密碼。有關重設多因素認證(MFA)的指導,請參見多因素認證小抄中的相關部分。

忘記密碼服務

密碼重設流程可分為兩個主要步驟,詳細說明如下。

忘記密碼請求

當使用者使用忘記密碼服務並輸入其使用者名稱或電子郵件時,應遵循以下步驟來實現安全流程:

用戶重設密碼

用戶通過提供通過電子郵件發送的令牌或通過短信或其他機制發送的代碼證明其身份後,應該將其密碼重設為一個新的安全密碼。為了確保這一步驟的安全性,應採取以下措施:

方法

為了允許用戶請求重設密碼,您將需要某種方式來識別用戶,或通過側通道與他們聯繫的方法。

可以通過以下任何方法來完成:

這些方法可以結合使用,以提供更高程度的保證,確保用戶是其所聲稱的人。無論如何,您必須確保用戶始終有一種方法來恢復其帳戶,即使這涉及聯繫支援團隊並向工作人員證明其身份。

一般安全實踐

對於重置標識符(令牌、代碼、PIN等),採用良好的安全實踐至關重要。一些要點不適用於離線方法,例如生存期限制。所有令牌和代碼應該:

URL標記

URL 標記是通過 URL 的查詢字串傳遞的,通常通過電子郵件發送給用戶。該過程的基本概述如下:

  1. 為用戶生成一個標記,並將其附加在 URL 的查詢字串中。
  2. 通過電子郵件將此標記發送給用戶。
    • 在創建重置 URL 時,不要依賴 Host 標頭,以避免 Host 標頭注入 攻擊。URL 應該是硬編碼的,或者應該根據一組受信任的域名列表進行驗證。
    • 確保 URL 使用 HTTPS。
  3. 用戶收到電子郵件,並瀏覽帶有附加標記的 URL。
    • 確保重置密碼頁面添加 Referrer Policy 標籤,值為 noreferrer,以避免 引薦來源泄漏
    • 實施適當的保護措施,以防止用戶對 URL 中的標記進行暴力破解,例如限制速率。
  4. 如有必要,執行任何額外的驗證步驟,例如要求用戶回答 安全問題
  5. 讓用戶創建新密碼並確認。確保應用程序中其他地方使用的相同密碼策略也應用於此處。

備註: URL 標記可以遵循 PINs 的相同行為,通過從標記創建受限制的會話。應根據開發人員的需求和專業知識做出決定。

PINs

PINs 是通過短信等側通道發送給用戶的數字(介於 6 到 12 位數之間)。

  1. 生成一個 PIN。
  2. 通過短信或其他機制將其發送給用戶。
    • 使用空格分隔 PIN 使用戶更容易閱讀和輸入。
  3. 用戶然後在重置密碼頁面上輸入 PIN 和他們的用戶名。
  4. 從該 PIN 創建一個有限的會話,僅允許用戶重置他們的密碼。
  5. 讓用戶創建新密碼並確認。確保應用程序中其他地方使用的相同密碼策略也應用於此處。

離線方法

離線方法與其他方法不同之處在於允許使用者在不從後端請求特殊識別符(如令牌或 PIN)的情況下重設密碼。然而,仍然需要後端進行認證,以確保請求是合法的。離線方法在註冊時或使用者希望配置時提供某種識別符。

這些識別符應該以離線方式並安全地存儲(例如 密碼管理器),並且後端應該遵循一般安全實踐。一些實現是建立在硬體 OTP 令牌憑證或任何其他可在企業內部使用的實現上。這些不在本速查表的範圍之內。

如果帳戶啟用了 MFA,並且您正在尋找 MFA 恢復,可以在相應的多因素認證速查表中找到不同的方法。

安全問題

安全問題不應作為重設密碼的唯一機制,因為攻擊者通常可以輕易猜測或獲取答案。然而,當與本速查表中討論的其他方法結合使用時,它們可以提供額外的安全層。如果使用了安全問題,則確保選擇安全問題如安全問題速查表中所討論的那樣。

帳戶鎖定

不應該因為忘記密碼攻擊而導致帳戶被鎖定,因為這可能會用於拒絕已知用戶名的用戶訪問。有關帳戶鎖定的更多詳細信息,請參見認證速查表