帳號、密碼,兩個欄位填完按下登入,WordPress 後台的文章、會員資料、外掛設定就整個攤在眼前——中間沒有任何一道關卡,再確認一次按下按鈕的真的是網站管理者本人,還是別處外流帳密試出來的。密碼一旦被拿到,不管是用猜的、拿外流資料庫比對的,還是社交工程騙來的,後台幾乎等於沒鎖。能補上這道關卡的做法叫雙因素驗證(Two-Factor Authentication,簡稱 2FA),密碼之外,再加一項只有你自己能提供的證明,兩樣都對才放行。
問題是 WordPress 核心本身沒有內建雙因素驗證,登入頁面預設只認密碼這一關,要多一道證明,得另外裝外掛才能用。身分驗證常見的依據不脫 3 種:知道的(密碼)、擁有的(手機、實體裝置)、本身的(指紋、臉部辨識),WordPress 外掛世界把第二種依據做成了幾種常見形式,驗證器 App、Email 一次性密碼、簡訊驗證碼,三者能提供的可信度並不一樣。
雙因素驗證是什麼?密碼之外的第二道身分證明
密碼之外,資安圈公認能拿來確認身分的依據其實只有 3 種:知道的東西、擁有的東西,以及本身的東西。密碼、PIN 碼屬於「知道的東西」,記在腦子裡就能用;手機、實體裝置,或早期銀行常見的密碼產生器鑰匙圈,屬於「擁有的東西」,得握在手上才有用;指紋、臉部辨識這類生物特徵屬於「本身的東西」,天生長在身上,別人拿不走也仿不來。單一因素驗證只檢查其中一種,雙因素驗證則是在密碼之外,再驗一種,通常是「擁有的東西」,也就是手機裡那支能產生驗證碼的 App。2 種依據都對,系統才放行;少一種,密碼再對也進不去。

WordPress 核心本身沒有內建雙因素驗證,登入頁面(wp-login.php)預設只認密碼這一關。WordPress 官方開發文件在講安全性時直接引用資安團隊的判斷,「你在網路上做任何事,安全性最脆弱的一環就是密碼」,也點出要補上第二道證明,得靠外掛。這也是這篇要處理的問題,後台防護的第一步,不是換一個更複雜的密碼,而是在密碼之外多加一關。
外掛世界常見的第二因素做法有 3 種:驗證器 App(每 30 秒自動更新一次的 6 位數字)、Email 一次性密碼,以及簡訊驗證碼。三者的可信度並不對等。WordPress 官方文件點出,簡訊驗證碼要透過電信通道傳送,這個通道本身就不算安全的通訊管道;美國國家標準暨技術研究院(NIST)更新的數位身分準則 SP 800-63-4 裡,也把透過電話網路(PSTN,簡訊與語音驗證碼都走這條路)傳送的一次性密碼列為「受限的驗證方式」,要求系統額外評估風險(例如偵測換卡、門號轉移等異常)才能繼續使用;相對地,驗證器 App 用的時間制一次性密碼(TOTP)與稍後會提到的備用碼,仍是準則認可、不需要額外限制的方式。這也是這篇文章只示範驗證器 App、不教簡訊驗證碼的原因。
WordPress 後台密碼是自動化攻擊的常見突破口
決定要用哪一種方式確認身分,只解決了一半的問題;真正該想清楚的是,WordPress 後台為什麼經常被列為攻擊目標。WordPress 的登入頁面網址幾乎不會變,絕大多數網站都是網域加上 /wp-login.php,攻擊者不用花力氣找入口,直接批次打這個固定網址就能鎖定成千上萬個目標。後台帳號的權限又高,一旦登入成功,就能改文章、加使用者、換佈景主題檔案,破壞範圍不是一篇貼文能比的,這正是它常被自動化攻擊鎖定的原因。
打進後台常見的手法有 2 種,原理不一樣。暴力破解是拿常見密碼或密碼字典,針對同一個帳號一輪一輪硬試;帳密重複使用攻擊(credential stuffing)則是拿別的網站外流的帳號密碼,直接原封不動拿來試 WordPress 後台的登入頁,賭的是使用者到處用同一組密碼。後者之所以成功率更高,是因為很多人真的會這樣做,Microsoft 引述 SANS 資安機構的研究,外流密碼裡有 73% 屬於重複使用,換句話說,別的網站洩漏的密碼,有很高的機率直接就是同一個人 WordPress 帳號的密碼。
這類攻擊的規模不是小事。Microsoft 在官方資安部落格提到,光是自家雲端服務每天就遭遇超過 3 億次偽造登入嘗試,多數都是自動化程式在背景跑,不需要人力盯著螢幕。這類攻擊擋不擋得住,Microsoft 的分析結論指出,啟用多因素驗證可以擋下超過 99.9% 的帳號入侵攻擊,這個數字後續也在 Microsoft Research 的研究裡得到呼應。換句話說,密碼被外流資料庫比對出來、或被暴力試出來,只是攻擊成功的前半段,只要後台多要求一組只有自己拿得到的驗證碼,這整條攻擊路徑幾乎就被封死了。回到 WordPress 官方文件那句話,密碼確實是安全性最脆弱的一環,但它不必是唯一的一關。

三款免費雙因素驗證外掛的定位與差異
知道後台為什麼容易被盯上,下一步就是動手補上這道關卡。WordPress 官方目錄裡,免費版就夠用的外掛不只一款,差別不在哪個比較安全,而在介面走向、以及一個人用還是一整個團隊用時,哪一款卡得比較順手。
Two Factor 由 WordPress 核心貢獻者社群直接開發維護,設定入口就在「使用者→個人資料」頁面裡的「雙因素選項」,每個使用者各自打開、各自設定,沒有另外的精靈畫面帶著操作。免費版支援驗證器 App(TOTP,相容 Google Authenticator、Authy、1Password 等主流 App)、Email 一次性代碼,以及一次可產生 10 組、每組 8 碼的備用碼。它是三款裡介面最貼近 WordPress 原生後台的一款,適合已經熟悉後台操作、只想幫自己這個帳號多加一道防護的單人網站,目前啟用安裝數在 10 萬以上,仍持續維護更新。

WP 2FA 由 Melapress 開發,走的是精靈導引路線,裝好啟用後直接跳出設定精靈,一步一步帶著選驗證方式、綁定 App,不需要先搞懂後台哪個選單藏在哪裡。免費版支援驗證器 App、Email 一次性代碼與 Passkey,也內建「強制指定角色啟用」的政策設定,可以設定寬限期讓使用者在期限內完成設定,也可以要求立即生效,並支援多站點網路。信任裝置、簡訊一次性密碼、YubiKey 硬體金鑰這幾項都留在付費版,免費版沒有。這種強制其他人一起啟用的能力,是它跟另外兩款外掛最大的差異,適合有多位管理員或編輯、需要統一政策的網站,啟用安裝數同樣在 10 萬以上。

miniOrange 2FA 免費版不限使用者數,支援驗證器 App、Email 一次性代碼、安全問題,還多了 Passkey(WebAuthn/FIDO2)這種免密碼登入的方式,可以搭配裝置本身的 Face ID、Touch ID 或 Windows Hello 完成登入,不用每次都打驗證碼。簡訊、WhatsApp、Telegram、推播通知則是付費版才有的項目。它的登入方式選項是三款裡最多元的,適合想讓使用者依裝置習慣挑選登入方式、而不是只認一種驗證碼的網站,啟用安裝數在 1 萬以上,維護紀錄同樣穩定。


三款各有各的重心,選定之後,接下來就是實際安裝、啟用、綁定手機 App 的完整流程,精靈導引的介面最適合一步步照著畫面走,換成另外兩款,綁定的邏輯其實大同小異,跑過一次就能舉一反三。
從安裝外掛到完成綁定的設定流程
後台防護補上這一關,動作沒有想像中複雜,裝外掛、跑一次精靈、用手機掃碼綁定,3 個步驟就能完成。示範用 WP 2FA,因為它的精靈會一步步帶著操作,不用自己在後台選單裡找設定藏在哪,每個步驟除了講怎麼點,也講為什麼要這樣設。

外掛啟用後設定精靈自動開啟
進到後台「外掛→安裝外掛」,搜尋「WP 2FA」,點「立即安裝」再「啟用」。跟大多數外掛不一樣的地方是,外掛一啟用,設定精靈會立刻自動跳出來,不用另外找入口,也不用先看說明文件才知道從哪裡開始,第一次接觸這款外掛的人,幾秒內就能開始往下設定。
如果不小心把這個精靈視窗關掉了,也不用重新停用再啟用一次外掛。精靈可以再從外掛自己的設定頁面重新叫出來,個別使用者要幫自己補設定,也可以直接到「使用者→個人資料」頁面裡找到對應的區塊繼續完成。
精靈的第一個畫面,決定主要驗證方式和適用範圍
精靈打開後的第一步,要選這次要用的主要驗證方式。畫面上驗證器 App 會被標成建議選項,這篇也照這個建議走,選 App、不選 Email,理由在前面已經講過,Email 一次性代碼要靠信箱收信,信箱本身若沒有防護,等於是拿另一道更弱的關卡來守這道關卡;驗證器 App 產生的數字不經過網路傳輸,攻擊者要攔截就沒有那條可以攔的路徑,這也是 NIST 準則裡把 TOTP 列為認可方式、卻對簡訊這類遠端傳送設限的原因。
選完主要驗證方式後,精靈接著會問這次設定要套用在誰身上,只套在正在操作的這個帳號,或是直接套用到指定角色,例如所有編輯以上權限的使用者。剛裝外掛的階段,建議先只設定自己的帳號,確認整套流程順暢,再回頭決定要不要對其他使用者強制套用政策,這部分留到後面的救援與政策設定再細講。
掃描 QR Code 只是第一步,還要輸入驗證碼確認綁定
精靈選完驗證器 App 之後,後台畫面會出現一組 QR Code。拿出手機,打開任何一款支援 TOTP 標準的驗證器 App,Google Authenticator、Microsoft Authenticator,或其他相容的 App 都可以,不限單一品牌,因為 QR Code 背後其實是業界公開的 otpauth:// 連結格式,不是某家外掛廠商自己發明的私有規格。掃描這組 QR Code,App 就會立刻產生一組每 30 秒自動更新一次的 6 位數字,這組數字是手機根據時間本地運算出來的,即使當下沒有網路或行動訊號,App 照樣能產生驗證碼,Google 官方支援頁面就寫明,Google Authenticator 不需要網路連線也能持續運作,這也是為什麼一定要輸入 App 產生的這組數字,而不是靠後台自己再發一次驗證碼。
掃完不代表就綁定成功,還有最後一步一定要做,把 App 當下顯示的那組 6 位數字,輸入回後台畫面上的驗證欄位並送出,系統驗證正確才算真正完成綁定。這一步很容易被跳過,有些人掃完 QR Code 看到手機 App 多了一筆紀錄,就以為設定好了,其實後台還沒收到確認。如果手機當下沒辦法掃相機,例如螢幕故障,或是在電腦前操作、手邊沒有另一支手機可用,畫面通常會有「無法掃描」的替代連結,點開會顯示一組文字金鑰,手動輸入到 App 裡同樣能產生對應的驗證碼,效果跟掃碼完全一樣。
綁定成功當下就要產生備用碼,用途跟 App 驗證碼不同
App 綁定成功的同一個流程裡,精靈會緊接著讓你產生一組備用碼。這一步只講操作,點下產生,畫面會列出好幾組代碼,先把它們記下來或截圖保存,保存方式留到後面獨立一節細講。
備用碼跟 App 產生的 6 位數字是兩回事,App 的數字每 30 秒換一組,用不用都會失效重來;備用碼則是一次性的,每一組只能用一次,用過就從清單裡劃掉,下次登入遇到問題時得用另一組沒用過的。兩者的分工很清楚,平常登入靠驗證器 App,App 真的用不了的時候,才輪到備用碼頂上。
登出後重新登入一次,確認新的驗證流程已經生效
設定介面顯示綁定成功,不代表這件事真的生效了,最快的確認方式就是實際跑一次登入流程,先登出後台,回到登入頁重新輸入帳號密碼。這一次,畫面應該會多跳出一個要求輸入驗證碼的畫面,這正是密碼跟驗證器 App 兩項依據都要對才放行的實際體現。打開手機 App,把當下顯示的 6 位數字填進去,才能真正進入後台。
如果這時候登入頁沒有多跳出驗證碼畫面,密碼一輸入就直接進了後台,代表剛剛的綁定可能沒有存成功,得回頭到使用者個人資料頁面確認雙因素驗證是不是真的被啟用,重新走一次綁定流程,不要跳過這個確認步驟,直接以為設定已經生效。
備用碼是找回帳號的最後一道鑰匙
登入流程重新跑過一次確認沒問題,手邊那組備用碼也該重新看一次,它不是設定完就可以丟著不管的東西。手機遺失、換了新手機卻忘記先把驗證器 App 的資料轉移過去,或裝置突然故障開不了機,任何一種情況發生,原本那組每 30 秒更新一次的 6 位數字就再也拿不到了。密碼還記得、帳號還在,卡在最後一道關卡進不去,備用碼是這個當下唯一還能自己救回帳號的方法,不用等其他人幫忙,也不用碰到主機後台。
正因為它是最後一道防線,存放的地方就不能跟出事的原因綁在一起。最常見的錯誤是把備用碼存在跟驗證器 App 同一支手機裡的相簿或備忘錄,手機真的遺失時,備用碼會跟著那支手機一起不見,等於白備了。WP 2FA 與 Two Factor 兩款外掛的官方文件都建議,備用碼要啟用之後放在安全的地方保管,而不是放在會跟裝置一起消失的位置。
比較妥當的做法是存進密碼管理工具,跟其他帳號密碼分開一個項目記,或印成紙本、跟其他重要文件一起收進抽屜或保險箱,重點是跟手機物理隔開,手機出事不會連帶波及。備用碼用掉一組就從清單裡劃掉,等所有組別都用完了,記得回個人資料頁面重新產生一批新的,別讓自己手上只剩最後一組都不知道。

忘記驗證碼的救援方式、強制啟用政策與 API 存取的例外
備用碼收好之後,還有幾種情況是它救不回來的,手機跟備用碼同時不在身邊,才是真正的最壞情境。手機不在身邊、備用碼也剛好找不到,等於同時失去兩道能證明身分的東西,這時候能做的第一件事,是看網站是不是還有其他管理員,請對方到使用者管理頁面幫忙重設雙因素驗證設定,是最快的路。
如果真的只有自己一個管理員,救回帳號得繞過網頁介面,改從主機端下手。登入虛擬主機的檔案總管或用 FTP 連進網站根目錄,找到 wp-content/plugins/ 底下那個雙因素驗證外掛的資料夾,把資料夾名稱改掉,例如加個後綴。WordPress 偵測不到原本的外掛檔案,會自動把它視為已停用,這時候就能只靠密碼登入。進去後台之後,把資料夾名稱改回來重新啟用外掛,再重新走一次綁定流程。這是通用的 WordPress 外掛救援手法,不限這一款外掛才能用。
雙因素驗證不只保護自己的帳號,也可以要求網站上其他使用者一起啟用。像 WP 2FA 這類外掛的免費版就內建政策設定,能指定特定角色,例如所有編輯以上權限的使用者,或全站帳號強制啟用,並且可以搭配寬限期,使用者在期限內都還能正常登入、完成設定即可,也可以設成立即生效,下一次登入就直接要求綁定。有多位成員在後台工作的網站,這比逐一提醒每個人自己去設定要可靠得多。
裝了雙因素驗證後,還有一件常被忽略的事,雙因素驗證只保護登入頁面這一關,透過應用程式密碼(Application Passwords)串接的外部工具,不會經過這道驗證。應用程式密碼是 WordPress 核心內建的另一套機制,設計給程式化存取用,例如手機上的 WordPress App、串接 REST API 的第三方發文工具,走的是 HTTP Basic Authentication,跟瀏覽器打開登入頁面輸入帳密是兩條不同的路徑。WordPress 官方文件也把這兩者分得很清楚,如果情境是瀏覽器互動式登入,就該用強密碼並啟用雙因素驗證;應用程式密碼則是另外一回事,本來就不會被這道驗證擋到。多數同類文章只教裝了雙因素驗證就安全,卻沒有講清楚這個保護範圍外的例外,後台多一道關卡是對的方向,但別誤以為裝完之後所有存取路徑都自動免疫。
雙因素驗證能做的事其實很單純,讓密碼被猜到、被外流資料庫比對出來,甚至整組被人拿在手上,後台照樣進不去,因為對方少了手機裡那支能產生驗證碼的 App。設定過程占不了太多時間,多數人真正遇到問題的地方不是操作太難,而是備用碼隨手存了個不安全的位置,或裝完就以為萬事大吉,忘了登入頁面以外還有應用程式密碼這條路。
把三款免費外掛依自己網站的規模挑一款,照著精靈走一次綁定,備用碼另外找地方收好,這道關卡就補上了。密碼還是那組密碼,但少了它單獨作主的機會,後台才真的比原本多了一層。
