為什麼已經用 Cloudflare WAF 封鎖了 wp-login.php,Wordfence 還是不停顯示有人在暴力破解?

Last Update at 2026 年 6 月 23 日
Likes

一個讓無數 WordPress 站長困惑的問題

如果您正在管理 WordPress 網站,您很可能遇過這個情況:明明已經透過 Cloudflare WAF(Web Application Firewall)或其他防火牆規則,將 /wp-login.php 的存取限制到只有特定 IP 才能訪問,甚至完全封鎖了該路徑,但每當您打開 Wordfence 的 Live Traffic 或 Login Security 報告時,依然會看見源源不絕的登入嘗試紀錄

「攻擊不是已經被擋在 Cloudflare 那一層了嗎?為什麼還會有這麼多失敗登入紀錄?」

這個問題在我們 EBuildHost 為香港客戶提供 WordPress 主機支援的過程中,幾乎每週都會被問到一次。今天我們就來徹底拆解這個現象,並在文末提供一個由我們團隊開發的免費診斷插件 Login Attempt Logger,協助您一勞永逸找出真正的攻擊入口。

一、為什麼 WAF 規則「看起來沒效」?

許多站長以為只要在 Cloudflare 加上一條 Firewall Rule 阻擋 wp-login.php,整個 WordPress 的登入攻擊就會消失。但實際上,攻擊者的手段遠比這複雜。以下是我們在實戰中觀察到的幾個常見原因:

1. 攻擊者根本沒走 wp-login.php

WordPress 的登入機制不只一個入口。除了大家熟知的 wp-login.php,還有以下幾個常被忽略的攻擊面:

  • XML-RPC 介面(xmlrpc.php):這是早期用於遠端發文的協議,至今仍預設開啟。攻擊者可以透過 system.multicall 方法,在單次請求中嘗試數百組帳密組合,效率比直接攻擊 wp-login.php 高出數十倍。
  • REST API 端點:例如 /wp-json/wp/v2/users 可能洩露使用者名稱,攻擊者再針對這些帳號進行字典攻擊。某些自訂端點若帶有 Authorization 標頭,也是常見的暴力破解目標。
  • 第三方表單外掛:WooCommerce 的客戶登入頁、會員系統外掛(如 Ultimate Member、MemberPress)、自訂登入頁外掛(如 Theme My Login)都會建立獨立的登入端點。
  • AJAX 端點:某些主題或外掛會透過 admin-ajax.php 處理登入邏輯,這個路徑通常不會被 WAF 規則涵蓋。

2. WAF 規則的繞過手法

即使您封鎖了 /wp-login.php,仍可能存在繞道方式:

  • 直接 POST 到伺服器 IP(繞過 Cloudflare):如果您沒有設定 Cloudflare 的 Authenticated Origin Pull 或在主機端限制只接受 Cloudflare IP,攻擊者可以直接連到 origin server。
  • URL 大小寫變化、加上查詢字串(如 wp-login.php?redirect_to=...)、或使用編碼技巧繞過簡單的字串比對規則。
  • 透過快取的舊 DNS 解析或歷史紀錄找到原始 IP 直接連線。

3. Wordfence 紀錄的是「到達 WordPress 的請求」

這一點非常關鍵。Wordfence 是 WordPress 內部的安全外掛,它能看見的是「已經穿過 Cloudflare、到達您的伺服器、並進入 WordPress 處理流程的請求」。換句話說,如果 Wordfence 還在持續記錄登入失敗,就代表這些請求確實繞過了您的 WAF,而不是您的規則無效。

問題是:Wordfence 預設只記錄 wp-login.phpxmlrpc.php 的登入嘗試。如果攻擊發生在其他端點(例如 WooCommerce 的 my-account 頁面或 REST API),您可能根本看不到完整的攻擊軌跡。

二、傳統排查方式的盲點

當客戶反映這類問題時,我們最初也是按部就班地檢查:Cloudflare 的 Firewall Events、伺服器的 access log、Wordfence 的 Live Traffic、WordPress 的登入失敗紀錄。

但問題在於,這些資料散落在不同系統,格式不一、時間戳記時區不同、欄位也不對齊。要拼湊出完整的攻擊路徑,往往需要花上半天時間,而且容易遺漏關鍵線索。

更麻煩的是,當攻擊者使用旋轉 IP(例如透過殭屍網路或代理池)時,單純看 IP 黑名單意義不大。我們需要知道的是:哪一個 URL 正在被攻擊、使用什麼 HTTP Method、嘗試的使用者名稱是什麼、User-AgentReferer 是什麼,以及這些事件發生的精確時間軸

三、EBuildHost 自製診斷插件:Login Attempt Logger

為了解決這個問題,我們的技術團隊開發了一個輕量級的 WordPress 診斷插件 Login Attempt Logger(登入稽核紀錄),目前已更新到 2.0.0 版本,專門用來完整捕捉所有可能的登入相關活動,協助您快速定位真正的攻擊入口。

它不是另一個防火牆,也不取代 Wordfence。它的角色是「鑑識記錄器(Forensics Logger)」——把分散在各個攻擊面的登入事件,集中、加密、結構化地記錄下來,讓您一眼看穿攻擊真相。

它會記錄哪五類事件?

插件會自動捕捉以下五類關鍵事件,這正是其他安全外掛容易遺漏的盲區:

事件類型觸發時機
登入頁請求wp-login.php 收到 POST 登入請求
登入失敗帳號或密碼錯誤
登入成功登入驗證通過(含 User ID、角色)
XML-RPC遠端發文、取得使用者資訊等 XML-RPC 認證呼叫
REST API帶有 Authorization 標頭且認證失敗時

每一筆紀錄包含的完整資訊

每一筆事件都會記錄以下欄位,讓您拼出完整的攻擊軌跡:

  • EVENT — 事件類型
  • DATETIME — 精確時間戳記
  • IP — 來源 IP(自動處理 Cloudflare 等反向代理的真實 IP)
  • URL — 被請求的完整 URL
  • METHOD — HTTP 方法(GET/POST 等)
  • USERNAME — 嘗試使用的帳號名稱
  • USER-AGENT — 瀏覽器或工具識別字串
  • REFERER — 來源頁面
  • Accept-Language — 語系標頭(用於識別自動化工具)
  • 補充說明(登入成功時的使用者 ID 與角色)

隱私保護: 插件絕不記錄密碼。URL 中的敏感查詢參數(如 token、nonce)會自動遮罩。

真實案例:十五分鐘找出真兇

舉一個我們真實處理過的案例:某客戶的 Wordfence 每天顯示上千筆登入失敗,但 Cloudflare 規則明明已經封鎖了 wp-login.php。在啟用我們的診斷插件後,只花了15分鐘就發現這次所有攻擊請求都指向 /xmlrpc.php,而 Referer 全部偽裝成 https://wordpress.com/、User-Agent 則使用看似正常的瀏覽器字串。這明顯是攻擊者透過 XML-RPC 的 system.multicall 方法進行批次帳密爆破,而非走傳統登入頁,並且刻意偽造 Referer 來規避簡單的來源檢查規則。

問題定位後,只需要在 Cloudflare 加上一條封鎖 /xmlrpc.php 的規則(或對該路徑啟用嚴格的速率限制),攻擊量瞬間歸零。

如果沒有這份完整紀錄,您可能會繼續加強 wp-login.php 的防護,卻完全沒有處理到真正的攻擊面。

四、為什麼 Login Attempt Logger 比一般 logger 更可靠?

許多免費的登入紀錄外掛都存在一些隱患:寫入資料庫導致網站變慢、紀錄以明文儲存可能洩露資料、沒有自動清理機制造成磁碟爆滿。我們在設計 Login Attempt Logger 時,特別解決了這幾個痛點:

採用 AES-256-GCM 加密儲存

所有新寫入的稽核紀錄都會以 AES-256-GCM 加密後存放於受保護的目錄中。即使有人透過某些路徑直接存取檔案(例如 Nginx 環境下的設定漏洞),也只能看到無法解讀的密文,不會洩漏 IP、帳號等敏感資料

不使用資料庫,零負擔

插件完全不寫入 WordPress 資料庫,採用獨立的檔案儲存方式。這帶來幾個好處:

  • 不影響 wp_options 或其他資料表大小
  • 大量攻擊湧入時不會拖慢資料庫
  • 即使插件停用,網站效能也不會受影響
  • 備份資料庫時不會夾帶大量稽核紀錄

內建防濫用與節流機制

  • 同一 IP 的重複事件設有寫入節流(預設 60 秒),避免攻擊者用 DDoS 灌爆您的紀錄檔
  • 登入頁的單純 GET 請求、機器人掃描不會大量寫入
  • 單一紀錄欄位長度有限制,防止惡意請求塞爆檔案

自動生命週期管理

插件會自動處理紀錄檔的輪替與清理,您不需要手動維護:

機制預設值
單檔大小上限10 MB(超過自動輪替)
月檔保留數量12 個月
Archived 保留數量24 個

嚴格的存取控制

  • 後台檢視、篩選、下載、刪除均需 管理員權限manage_options)與 安全 nonce 驗證
  • 儲存目錄優先放在網站根目錄外的私有路徑
  • 自動建立 .htaccess(Apache)與 web.config(IIS)防護檔

五、後台介面:3 分鐘上手的稽核工具

啟用插件後,只需到 設定 → 登入稽核,即可看到所有功能:

強大的篩選功能

進入單一紀錄檔詳情,可以使用:

  • 事件類型篩選(只看登入失敗、只看 XML-RPC 等)
  • 關鍵字搜尋(IP、帳號、URL、User-Agent 任意欄位)
  • 日期範圍篩選
  • 每頁 20 筆翻頁瀏覽,點「展開」查看完整 METHOD、User-Agent、Referer

兩種檢視模式

  • 表格檢視:適合日常稽核與篩選
  • 原始文字檢視:解密後的完整文字格式,方便複製與人工比對
table view
表格檢視
raw view
原始文字檢視

一鍵下載 .log 檔

需要交給 IT 同事或主機商分析?直接點下載按鈕,系統會輸出解密後的可讀 .log。下載過程同樣需通過管理員身份驗證,無法由公開 URL 直接取得明文。

六、典型使用情境

情境一:排查暴力破解

  1. 開啟當月紀錄檔 → 檢視
  2. 事件類型選「登入失敗
  3. 依 IP 或帳號排序,立刻看出短時間內大量失敗的來源
  4. 將該 IP 或網段加入 Cloudflare 黑名單

情境二:確認帳號是否被盜

  1. 事件類型選「登入成功
  2. 核對 IP、時間、User-Agent 是否與您的實際操作一致
  3. 發現可疑的成功登入立即更換密碼並啟用 2FA

情境三:診斷 Cloudflare 規則是否生效

  1. 設定 WAF 規則後,過幾小時回來檢視紀錄
  2. 若仍有來自境外 IP 的登入嘗試,代表規則未涵蓋全部入口
  3. 透過紀錄中的 URL 欄位,找出真正的攻擊路徑加以補強

情境四:交付稽核報告

  1. 點選下載當月紀錄
  2. 取得明文 .log 檔案
  3. 以文字編輯器或專業日誌分析工具(如 GoAccess、Splunk)進一步分析

七、系統需求

項目要求
WordPress建議 5.8 或以上
PHP7.4 或以上
PHP 擴充OpenSSL(用於加密)
權限僅網站管理員可存取

支援 Cloudflare、Nginx 反向代理環境(自動辨識真實 IP)。對於進階使用者,也提供完整的 filter hook,可自訂儲存目錄、可信代理 IP 等選項。

八、如何免費取得 Login Attempt Logger?

我們將這個原本只供內部客戶使用的工具,免費提供給所有關注 WordPress 安全的香港站長與開發者。由於我們希望持續優化這個工具,並向使用者推送版本更新與安全性改進通知,因此採用 Email 索取的方式提供下載連結。

索取方式

請在下方表單填寫您的 Email,系統會即時驗證並在頁面上直接顯示下載連結,無需等待郵件、無需檢查垃圾信箱。

填寫後,您將立即取得:

  • Login Attempt Logger 2.0.0 插件下載連結(ZIP 格式,可直接於 WordPress 後台「外掛 → 安裝外掛 → 上傳外掛」)
  • 安裝與設定快速上手指南
  • 常見攻擊樣態解讀手冊(教您怎麼看懂紀錄)
  • Cloudflare WAF 與 Login Attempt Logger 搭配使用建議

索取 Login Attempt Logger 診斷插件

九、結語:看不見的攻擊,比看得見的更危險

WordPress 的攻擊面遠比一般站長想像中廣泛。當您只盯著 wp-login.php 時,攻擊者可能早已透過 XML-RPC、REST API 或第三方外掛的端點悄悄滲透。Wordfence 持續顯示登入嘗試,並不代表您的 WAF 失效,而是在告訴您「還有其他入口您沒有注意到」。

與其盲目疊加防護規則,不如先把「敵人從哪裡進來」這件事情徹底搞清楚。這就是我們開發 Login Attempt Logger 的初衷——讓您看見原本看不見的攻擊軌跡,並用加密、零資料庫、自動清理的設計,確保這個診斷工具本身不會成為新的安全或效能負擔。

如果您希望進一步了解 EBuildHost 提供的香港本地 WordPress 主機服務、24/7 中文技術支援,或是需要我們的工程團隊協助分析您的紀錄檔,歡迎隨時聯絡我們。

立即在上方填寫 Email,開始找出您網站的真正攻擊入口。

If you find this article helpful, please like it and share it on social media to let more people know about it!