收件匣的夢魘
其實一直以來我都很少更新我的部落格,工作和生活真的實在太忙,先前一直都有類似的問題:打開信箱,幾乎每天都有兩三封來自Wordpress的外掛Limit Login Attempts Reloaded 通知我登入失敗的警告信。因實在太忙所以都用信件過濾器把類似的信件過濾掉,其實對我來說就是偶而清空這一類的信件,倒也沒什麼危險性。

Failed login by IP xxx.xxx.xxx.000 — www.saraliang.com近期AI的加速成長,今年開始,我的網站開始被瘋狂的被各個國家嘗試登入帳密,看到每天都有數十封類似的信件感覺像是自動化程式針對我的網站進行 Brute Force Attack(暴力破解),
機器人暴力破解的目標: WordPress 預設的後台登入頁面:/wp-admin。嘗試不同的帳號密碼組合,試圖硬闖我的後台介面。
問題有多嚴重?每天機器人最高有千次嘗試破解後台的紀錄

即便我是一個很少更新Blog的網站,仍然會被機器人攻擊,從監控數據來看,攻擊最猛烈的那天,單日登入嘗試次數超過 1,182 次。高峰集中在 5/16 和 5/23 前後,可以明顯看出是有組織的自動化攻擊波段。
這些 IP 來自世界各地:俄羅斯、荷蘭、美國、東南亞,我覺得根本不是我的瀏覽者…
對我的網站來說,這帶來幾個實質危害:
- 伺服器資源被白白消耗,拖慢網站速度
- 帳號有被攻破的風險,萬一密碼不夠強網站就直接淪陷
- 信箱被警告信淹沒,真正重要的信件根本看不到
我需要一個系統性的解法,加上我的網址本來就有使用Cloudflare免費方案,因此我使用Cloudflare內部安全設定來做預防性的封鎖。

和AI討論相關解法之後,我決定設下以下三層:
- ① 第一層 Cloudflare:「WordPress login page Taiwan IP only」規則 → 先做地理封鎖,判斷是不是台灣 IP。由於絕大多數的惡意掃描與殭屍網路都來自國外,境外 IP 在這一層就會被直接擋掉,同時能大幅節省網站主機的效能與頻寬。
- ② 第二層 Cloudflare:CAPTCHA 驗證碼規則 → 針對通過第一關、確認是台灣 IP 的訪客,再加一層真人驗證(如 Managed Challenge 或 Turnstile)。用來防止攻擊者特地換用「台灣當地的雲端主機、代理伺服器(Proxy)或 VPN 跳板」來繞過地理限制的情境,有效卡住自動化的暴力破解腳本。
- ③ 第三層 WordPress 登入加入兩階段驗證(2FA / Authenticator) → 這是位於網站內部的終極身分鑑別。當訪客通過前兩關、且輸入了正確的帳號密碼後,必須再輸入手機驗證器(如 Google Authenticator)每 30 秒隨機產生的 6 位數動態密碼。如此一來,即使密碼不幸外洩,只要駭客沒有拿走你的實體手機,就絕對無法登入後台。
① 第一層 Cloudflare:「WordPress login page Taiwan IP only」規則
我的網站登入應該只會在台灣進行登入。我沒有任何需求會在國外 IP 登入我的 WordPress 後台。
所以第一步,我在 Cloudflare 建立了防火牆規則(WAF Rule):
只有來自台灣的IP,才能存取
/wp-admin和/wp-login.php
非台灣地區的其他地區的 IP 一律擋在門外:直接 Block(封鎖),連頁面都看不到。
設定步驟
- 登入 Cloudflare,進入你的網域
- 左側選單點選 Security(安全性)→ WAF
- 點擊 Create rule(建立規則)
- 填入規則名稱,例如我填的是:WordPress login page Taiwan IP only
- 設定條件:
(http.request.uri.path contains "/wp-login.php" or (http.request.uri.path contains "/wp-admin" and not http.request.uri.path contains "/wp-admin/admin-ajax.php")) and ip.geoip.country ne "TW"
- 動作選擇:Block
- 儲存並部署

設定完成後,來自台灣以外的所有 IP 嘗試連到後台,Cloudflare 直接在指定的檔案節點攔截。效果立竿見影:警告信數量從幾十封掉到個位數,一個月後幾乎為零。

② 第二層 Cloudflare:CAPTCHA 驗證碼規則
地理封鎖解決了境外攻擊,但如果未來攻擊者換用台灣 IP 的代理伺服器呢?
所以我加了第二層防線:登入頁面加入真人驗證。
Cloudflare 本身有提供 Managed Challenge(托管驗證) 功能,可以在存取特定頁面前,先讓訪客完成一個低摩擦的人機驗證(通常是無感的 JS 挑戰,或視需要跳出圖形驗證)。
只需要在 WAF 規則中,針對 /wp-login.php 的台灣 IP 存取,動作從「允許」改為 Managed Challenge,就能讓所有登入嘗試都先過一關。

設定完之後,驗證攻擊的狀態是否有改善
| 設定防護前 | 設定防護後 | |
|---|---|---|
| 每日警告信封數 | 30~50 封 | 0~2 封 |
| 單日最高登入嘗試 | 1,182 次 | 個位數 |
| 境外 IP 存取後台 | 大量 | 全數封鎖 |
信箱終於清靜了。我的天。
③ 第三層 WordPress 登入加入兩階段驗證(2FA / Authenticator)
什麼是兩階段驗證(2FA)?
一般的登入只需要「帳號」與「密碼」,這屬於「你知道的東西」。一旦密碼不小心外洩(例如在其他網站用了相同密碼而遭到外洩),駭客就能輕易登入。
而兩階段驗證(2FA)則是在密碼之外,加上了第二層鑑別因子——「你擁有的東西」(通常是你的手機)。當你輸入正確的密碼後,系統會要求輸入手機 App 每 30 秒自動隨機產生的一組 6 位數動態密碼(TOTP)。
💡 核心優勢: 即使高階駭客透過各種管道得知了你的 WordPress 管理員密碼,只要他們沒有你手上的那支實體手機,就絕對無法登入你的網站後台! 這能徹底終結任何自動化的密碼破解腳本。
啟用 Wordfence 套件後,依據以下步驟進行 2FA :
步驟 1:進入設定頁面
- 登入 WordPress 後台。
- 在左側選單找到 Wordfence,點選 Login Security。
步驟 2:啟用 2FA
- 在 Two-Factor Authentication 分頁中,會看到一個 QR Code。
- 使用手機上的驗證器 App(如 Google Authenticator、Microsoft Authenticator 或 Authy)掃描該 QR Code。
- 手機 App 會出現一組 6 位數的即時代碼,將代碼輸入到 WordPress 頁面下方的 “Authentication Code” 欄位。
- 點擊 Activate 按鈕。
步驟 3:下載備用代碼 (Recovery Codes)
- 啟用後,Wordfence 會提示下載或列印 Recovery Codes。
- 請務必下載並妥善保存這些代碼。若手機遺失或 App 資料損毀,這是您唯一能恢復登入的方式。
注意事項
- 角色權限設定: Wordfence 允許針對不同使用者角色(例如 Administrator、Editor)設定強制啟用 2FA。在 “Settings” 分頁中,可以調整哪些人必須強制使用 2FA。
- 避免被鎖定: 強烈建議在啟用前先確認手機時間是否與網路時間同步,以免驗證碼過期導致無法登入。
- 如果不慎被鎖定: 由於 Wordfence 是透過
.htaccess或插件檔案運作,若真的無法登入,您可以透過 FTP 進入/wp-content/plugins/wordfence/將該資料夾重新命名來暫時停用它,恢復登入後再將其改回即可。
如果你也有同樣的問題,從這裡開始
你不需要是工程師,也能完成這些設定。我的建議是:
- 先確認你的網站已經接上 Cloudflare(免費方案就夠用)
- 在Cloudflare建立 WAF 地理封鎖規則,鎖定
/wp-admin只允許本國 IP - 在Cloudflare開啟登入頁的 Managed Challenge,擋住自動化機器人
- 安裝 Wordfence 或 Limit Login Attempts,作為 WordPress 端的補充防線
- 定期檢視 Cloudflare 的安全性報告,掌握網站狀態
後記
資安這件事,往往是「事後才後悔沒做」。
我很慶幸在帳號被攻破之前先做了預防行動。雖然我的Blog沒有甚麼隱私資料,但若是變成別人的跳板網站或是藏了病毒,可能也會有犯法的風險,Cloudflare 的免費方案已經提供非常強大的保護能力,對個人Blog網站來說,完全夠用。
如果你也每天收到一堆 Failed login by IP 的信,就趕快找尋適合自己的解決方案吧!
