「忘記密碼?」通往的是讓不知道密碼的人設定新密碼的機制。這使它成為一條驗證路徑,而且通常是服務裡最弱的一條。
為什麼只強化登入擋不住
一般路徑:登入
長密碼・多因素驗證・速率限制・暴力破解偵測
─────── 同一個帳號 ───────
另一條路徑:密碼重設
收得到信就能用・常常不要求第二因素・權杖強度看不見
重設通常被當成方便使用者的功能來做,所以它往往沒有用與驗證同樣嚴格的標準來設計和審查。但就功能而言,它把帳號的控制權交給不知道密碼的人。它和登入本身屬於同一類。
這和我們依入侵方式整理 2026 年日本的事件(英文)時發現的一致:**用有效的認證資訊進入,比利用漏洞更常見。**重設流程,正是服務透過自己的正式程序簽發這種認證資訊的地方。
5 種型態
- 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 位元的亂數;有效期限以數十分鐘為單位;使用後失效;同一帳號簽發新權杖時,讓舊權杖也失效。比起數值,更重要的是三個性質:猜不到、不能重複使用、不會永久有效。
實作順序
讓權杖猜不到(第一優先)
用密碼學用途的亂數來源產生,並以 URL 安全的方式編碼。不要用一般用途的亂數函式,「看起來隨機」和「無法預測」是不同的性質。資料庫裡存權杖的雜湊值,而不是權杖本身,這樣即使資料庫被讀取,也不會直接拿到可用的權杖(與密碼的儲存、雜湊與加鹽是同樣的道理)。
給它期限,而且只能用一次
使用後失效,時間到了也失效。同一帳號簽發新權杖時,讓舊權杖也失效,忘了這點就又回到型態 2。
絕不用外部輸入組 URL
重設連結從設定產生,或用信任網域清單驗證。不要把請求標頭直接帶進電子郵件。OWASP 明確點名了這一項。
讓回應一致,並加上速率限制
不論哪種情況都回傳相同的文字和相同的時間,只在帳號確實存在時寄信。針對自動送出,加上以帳號為單位的速率限制或 CAPTCHA。使用者不會覺得不便,而從外部看不出兩種情況的差別。
完成時把事情做完
重設完成時,讓現有工作階段失效(如果帳號已經被盜,這是把攻擊者趕出去的唯一方法),並寄出密碼已重設的通知(信中不含密碼)。能做到的話,在重設路徑上也要求第二因素,讓重設不會變成繞過多因素驗證的路。
重設真正依賴的是信箱
上面全部做到,重設的安全仍取決於是否只有帳號持有人收得到那封信。電子郵件帳號一旦被入侵,做得好的重設流程反而會比草率的更確實地把帳號交給攻擊者。所以使用者這邊的優先事項也落在同一處:對電子郵件帳號採取最強的保護,也就是強且不重複的密碼加上多因素驗證,最好是通行金鑰(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
接著讀
- 防禦:密碼管理器的選擇與使用/密碼的儲存、雜湊與加鹽
- 用語:什麼是雙因素驗證/什麼是通行金鑰/什麼是網路釣魚
- 濫用控制:速率限制與濫用控制(重設路徑的速率限制該放在哪裡)
- 趨勢:2026 年,攻擊者帶著認證資訊進來的情況多於利用漏洞(英文)
FAQ
Q已經啟用多因素驗證,密碼重設做得弱還有影響嗎?
有。很多實作在重設路徑上不要求第二因素,這種情況下,重設就成了繞過第二因素、把帳號拿回去的方法。你要保護的不是登入畫面的強度,而是通往帳號的每一條路徑的強度。重設完成時讓現有工作階段失效,並盡可能在重設路徑上也要求第二因素。
Q重設權杖要多長、有效期限要多久?
OWASP 的 Forgot Password Cheat Sheet 要求權杖用密碼學安全的亂數產生器產生、長度足以抵抗暴力破解、使用後失效,但沒有規定幾個字元或幾分鐘。這些數值要由你決定。我們的實務預設值:URL 安全編碼、至少 128 位元的亂數;有效期限以數十分鐘為單位;使用後失效;同一帳號簽發新權杖時,讓舊權杖也失效。比起數值,更重要的是三個性質:猜不到、不能重複使用、不會永久有效。
Q顯示「這個電子郵件地址沒有註冊」不是比較貼心嗎?
對使用者貼心,但也讓攻擊者免費確認哪些地址在你的服務有帳號。OWASP 要求帳號存在與不存在時顯示一致的訊息,回應時間也要一致。不論哪種情況都顯示同樣的內容,只在帳號確實存在時才寄信,使用者不會覺得不便,外部也看不出差別。
Q身為使用者可以做什麼?
收到不是自己申請的重設信,代表有人試過重設你的帳號。不要點信中的連結,自己登入該服務,確認密碼沒有在其他地方重複使用,並啟用多因素驗證。也請記住重設真正依賴的是什麼:你的信箱。只要有人能讀你的電子郵件,就能接連重設你許多帳號的密碼。請對電子郵件帳號採取最強的保護。