跳至主要內容
>_ITDITD網站資安平台

資安指南

密碼重設的設計缺陷:登入再強也會被盜帳號的 5 種情況與修正方式

就算密碼夠長、也啟用了多因素驗證,只要「忘記密碼?」做得弱,攻擊者就能不走登入、改走重設來盜取帳號。本文整理重設流程實際出問題的 5 種情況、OWASP 明確要求的事項,以及指南刻意交給你自己決定的部分該怎麼定。

發布於 2026-09-05 更新於 2026-10-04 最後核實 2026-09-05 閱讀時間 2 分鐘

「忘記密碼?」通往的是讓不知道密碼的人設定新密碼的機制。這使它成為一條驗證路徑,而且通常是服務裡最弱的一條。

為什麼只強化登入擋不住

一般路徑:登入

長密碼・多因素驗證・速率限制・暴力破解偵測

─────── 同一個帳號 ───────

另一條路徑:密碼重設

收得到信就能用・常常不要求第二因素・權杖強度看不見

重設是與登入分開的另一條驗證路徑。登入再強,重設流程弱的話,那才是真正的強度。

重設通常被當成方便使用者的功能來做,所以它往往沒有用與驗證同樣嚴格的標準來設計和審查。但就功能而言,它把帳號的控制權交給不知道密碼的人。它和登入本身屬於同一類。

這和我們依入侵方式整理 2026 年日本的事件(英文)時發現的一致:**用有效的認證資訊進入,比利用漏洞更常見。**重設流程,正是服務透過自己的正式程序簽發這種認證資訊的地方。

5 種型態

CWE-640 在實務上的樣子
1. 可被猜中的權杖
流水號、時間戳記、短字串,或非密碼學用途的亂數。別人的重設可以靠猜測或暴力破解完成
2. 不會失效的權杖
沒有期限、用過仍有效、可重複使用。簽發一次的連結會一直有效
3. 留在信箱裡的連結
能讀信箱的人就能讀到重設連結。轉寄規則、共用帳號、離職同事的信箱,看得到信的人比你想像的多
4. 可從外部指定的目的地
用請求的 Host 標頭組出重設 URL,外部送來的值就可能變成信中的連結(Host 標頭注入)
5. 洩漏帳號資訊的回應
貼心的「未註冊」訊息或回應時間的差異,會讓表單變成從外部確認誰有帳號的工具(使用者列舉)

這一類問題的名稱是 CWE-640「Weak Password Recovery Mechanism for Forgotten Password(忘記密碼時的弱密碼復原機制)」。它的定義是:產品「具備讓使用者在不知道原密碼的情況下復原或變更密碼的機制,但該機制很弱」。請注意這句話的意思:問題不在於有這個功能,而在於這個功能不如它能取代的驗證那樣強。

不要把安全提問當成唯一的途徑

OWASP 對安全提問的立場是:它們的答案常常容易被猜到或被攻擊者取得,所以不應作為重設密碼的唯一機制;同時也指出,與其他方法併用時可以多一層保護。在社群個人檔案和公開紀錄隨處可見的年代,母親的娘家姓並不是秘密。

指南要求的,與留給你決定的

實作時容易猶豫的就是這裡。請把兩者分開。

OWASP 明確要求的

・用密碼學安全的亂數產生器產生權杖
・長度足以抵抗暴力破解
・使用後失效
・帳號存在與不存在時回傳一致的訊息
・回應時間也要一致,以防止列舉
・用速率限制、CAPTCHA 等控制對付自動送出
・自動讓現有工作階段失效,或詢問使用者是否要這樣做
・寄信通知使用者密碼已重設,而且信中不放密碼
・組重設 URL 時不依賴 Host 標頭(寫死,或用信任網域清單驗證)
・確保 URL 使用 HTTPS

指南沒有規定的數值(由你決定)

・權杖的實際長度:只寫了「夠長」
・有效期限:要求使用後失效,但時間限制沒有給數字

不要把沒有數字解讀成「這不需要決定」。它需要有理由地決定,並寫下來。

我們的實務預設值:URL 安全編碼、至少 128 位元的亂數;有效期限以數十分鐘為單位;使用後失效;同一帳號簽發新權杖時,讓舊權杖也失效。比起數值,更重要的是三個性質:猜不到、不能重複使用、不會永久有效。

實作順序

1

讓權杖猜不到(第一優先)

用密碼學用途的亂數來源產生,並以 URL 安全的方式編碼。不要用一般用途的亂數函式,「看起來隨機」和「無法預測」是不同的性質。資料庫裡存權杖的雜湊值,而不是權杖本身,這樣即使資料庫被讀取,也不會直接拿到可用的權杖(與密碼的儲存、雜湊與加鹽是同樣的道理)。

2

給它期限,而且只能用一次

使用後失效,時間到了也失效。同一帳號簽發新權杖時,讓舊權杖也失效,忘了這點就又回到型態 2。

3

絕不用外部輸入組 URL

重設連結從設定產生,或用信任網域清單驗證。不要把請求標頭直接帶進電子郵件。OWASP 明確點名了這一項。

4

讓回應一致,並加上速率限制

不論哪種情況都回傳相同的文字和相同的時間,只在帳號確實存在時寄信。針對自動送出,加上以帳號為單位的速率限制或 CAPTCHA。使用者不會覺得不便,而從外部看不出兩種情況的差別。

5

完成時把事情做完

重設完成時,讓現有工作階段失效(如果帳號已經被盜,這是把攻擊者趕出去的唯一方法),並寄出密碼已重設的通知(信中不含密碼)。能做到的話,在重設路徑上也要求第二因素,讓重設不會變成繞過多因素驗證的路。

重設真正依賴的是信箱

上面全部做到,重設的安全仍取決於是否只有帳號持有人收得到那封信。電子郵件帳號一旦被入侵,做得好的重設流程反而會比草率的更確實地把帳號交給攻擊者。所以使用者這邊的優先事項也落在同一處:對電子郵件帳號採取最強的保護,也就是強且不重複的密碼加上多因素驗證,最好是通行金鑰(passkey)。這也是服務商端的外洩擴散到你身上的途徑(主機服務商遭入侵時該怎麼做)。

從使用者這邊看

  • 收到不是自己申請的重設信,代表有人試過。不要點連結,自己登入該服務確認(網路釣魚看起來一模一樣)。
  • 重設後其他裝置被登出,是正確實作的跡象。重設後仍保留其他工作階段的服務,讓你沒有辦法把入侵者踢出去。
  • 重設時沒有要求第二因素,表示在該服務的這條路徑上,多因素驗證可能被繞過。對重要的帳號值得實際試一次。
  • 停止重複使用密碼,最好交給密碼管理器。

本站的看法:把它當作驗證功能來做,而不是便利功能

重設流程變弱,不是因為技術上很難,而是因為被歸錯了類。登入由負責驗證的人仔細打造;「忘記密碼?」則被當成客服用的途徑輕鬆做掉。這種待遇上的差別就是弱點。我們的立場很簡單:任何交出帳號控制權的操作都是驗證功能,包括重設、變更電子郵件地址、重新註冊第二因素、客服人員的手動復原。**強度由最弱的路徑決定,而不是最強的。**請把自己服務中所有通往帳號的路徑寫出來,通常會比你想像的多。

資料來源(一手資料)

  • OWASP Cheat Sheet Series「Forgot Password Cheat Sheet」— cheatsheetseries.owasp.org(上方列為「明確要求」的每一項都出自這份文件;它沒有規定權杖長度或有效期限)
  • MITRE,CWE-640「Weak Password Recovery Mechanism for Forgotten Password」— cwe.mitre.org

接著讀

FAQ

Q已經啟用多因素驗證,密碼重設做得弱還有影響嗎?
A

有。很多實作在重設路徑上不要求第二因素,這種情況下,重設就成了繞過第二因素、把帳號拿回去的方法。你要保護的不是登入畫面的強度,而是通往帳號的每一條路徑的強度。重設完成時讓現有工作階段失效,並盡可能在重設路徑上也要求第二因素。

Q重設權杖要多長、有效期限要多久?
A

OWASP 的 Forgot Password Cheat Sheet 要求權杖用密碼學安全的亂數產生器產生、長度足以抵抗暴力破解、使用後失效,但沒有規定幾個字元或幾分鐘。這些數值要由你決定。我們的實務預設值:URL 安全編碼、至少 128 位元的亂數;有效期限以數十分鐘為單位;使用後失效;同一帳號簽發新權杖時,讓舊權杖也失效。比起數值,更重要的是三個性質:猜不到、不能重複使用、不會永久有效。

Q顯示「這個電子郵件地址沒有註冊」不是比較貼心嗎?
A

對使用者貼心,但也讓攻擊者免費確認哪些地址在你的服務有帳號。OWASP 要求帳號存在與不存在時顯示一致的訊息,回應時間也要一致。不論哪種情況都顯示同樣的內容,只在帳號確實存在時才寄信,使用者不會覺得不便,外部也看不出差別。

Q身為使用者可以做什麼?
A

收到不是自己申請的重設信,代表有人試過重設你的帳號。不要點信中的連結,自己登入該服務,確認密碼沒有在其他地方重複使用,並啟用多因素驗證。也請記住重設真正依賴的是什麼:你的信箱。只要有人能讀你的電子郵件,就能接連重設你許多帳號的密碼。請對電子郵件帳號採取最強的保護。