每一個 WordPress 網站,只要裝好的那一刻起,後台登入頁就掛在同一個眾所皆知的位置:網域/wp-login.php 與 網域/wp-admin。攻擊者不必猜,直接對著這兩個固定路徑灌帳號密碼,一天上萬次的暴力登入嘗試對台灣中小型網站來說是常態。就算密碼夠強、就算裝了雙因素驗證讓對方永遠登不進來,那些失敗請求還是會持續吃掉伺服器資源、塞滿安全外掛的記錄。
WordPress 隱藏登入網址,就是把這個固定靶子移開。把 wp-login.php 換成只有你知道的自訂路徑,讓大部分自動化機器人連登入表單都找不到;再進一步用伺服器層的 IP 限制鎖住 wp-admin,連知道網址的人也進不來。這篇會把「改登入網址」與「限制 wp-admin 存取來源」兩條防線拆開講清楚:各自擋住什麼、擋不住什麼、什麼情況該用哪一條,以及把自己鎖在門外時要怎麼救回來。
WordPress 預設登入路徑為什麼是攻擊熱點
WordPress 全球市占極高,而它的登入入口又是寫死的標準路徑,這讓 wp-login.php 成為自動化攻擊腳本的首要目標。攻擊者寫一支程式掃過大量網域,對每一個的 /wp-login.php 送出帳密組合,完全不需要針對你的網站做任何客製。
這類攻擊主要分兩種。一種是暴力破解(brute force),用字典檔或常見密碼組合反覆嘗試登入;另一種是針對 xmlrpc.php 的攻擊,這個檔案支援一次請求帶多組帳密驗證,效率比逐次登入更高,常被拿來放大攻擊。
值得注意的是,這些請求即使全部失敗,傷害也已經造成。每一次登入嘗試都會觸發 PHP 執行與資料庫查詢,大量併發的失敗請求等同於一場小型的資源消耗攻擊,在共用主機或資源有限的 VPS 上,可能拖慢整站回應速度。安全監控外掛(例如 Wordfence)的即時記錄會被失敗登入塞滿,真正需要注意的異常反而被淹沒。
所以隱藏登入路徑要解決的不只是「會不會被猜中密碼」,而是「要不要讓這些無意義的請求有機會打到你的登入程式」。把入口藏起來,等於在攻擊真正執行之前就讓它撲空。
改登入網址與鎖 IP 是兩種不同層級的防線
先把觀念釐清,後面的選擇才不會用錯。隱藏登入網址與限制 wp-admin 存取來源是兩種不同層級的手段,擋的東西不一樣,適用情境也不同。
改登入網址(隱藏路徑)屬於「模糊化」的防護。它把登入表單從 wp-login.php 搬到例如 /my-secret-entry 這種只有你知道的路徑,讓盲掃固定路徑的機器人找不到入口。它的價值在於大幅降低自動化攻擊的命中率,但它不是真正的存取控制——任何知道新網址的人,還是可以正常打開登入頁。
限制 wp-admin 存取來源(IP 限制)屬於伺服器層的「存取控制」。它在請求還沒進到 WordPress 之前,就由 Apache 或 Nginx 判斷來源 IP,不在白名單上的一律擋掉或轉走。這條防線更硬:就算對方拿到了正確帳號密碼、就算知道登入網址,只要 IP 不對,連登入表單都看不到。
兩者的關係是互補,不是二選一。下面用一張表把差異攤開。
| 比較項目 | 改登入網址 | 限制 wp-admin 來源 IP |
|---|---|---|
| 防護層級 | 應用層(WordPress 內)的路徑模糊化 | 伺服器層(Apache / Nginx)的存取控制 |
| 主要擋住 | 盲掃固定路徑的自動化機器人 | 所有非授權來源,含已知帳密的人為攻擊 |
| 知道網址就能進? | 可以 | IP 不對就進不來 |
| 適合的使用情境 | 多人、不固定地點登入的網站 | 固定地點、少數管理者的網站 |
| 把自己鎖在外的風險 | 低(忘記網址可停用外掛復原) | 較高(IP 變動就進不去) |
| 設定門檻 | 低(外掛即可) | 中(需碰設定檔) |
簡單的判斷原則:如果你的網站只有你一兩個人管理、而且都在固定的辦公室或家裡網路登入,IP 限制是最強的選擇。如果有多位編輯、客戶、外包人員在不同地點登入,或你自己常出差換網路,那改登入網址搭配雙因素驗證會比硬鎖 IP 實際得多。兩者也可以疊加:先改網址擋掉機器人,再對自訂網址鎖 IP,達到最高強度。
用 WPS Hide Login 外掛更改登入路徑
對大多數人來說,改登入網址最省事的方式是外掛。WPS Hide Login 是目前最常被使用的選擇,它的運作方式是攔截頁面請求,把原本的 wp-login.php 與 wp-admin 入口停用,改導向你設定的自訂路徑;它不會真的改動或刪除核心檔案,所以停用外掛就能還原。
設定流程很短:
第 1 步、在後台「外掛」搜尋並安裝、啟用 WPS Hide Login。
第 2 步、到「設定 > WPS Hide Login」,在登入網址欄位填入新的路徑,例如 my-entry-8821。
第 3 步、設定 Redirection URL,也就是有人嘗試打開舊的 wp-login.php 或 wp-admin 時要被導去哪。預設會回傳 404,你也可以指定導到首頁。
第 4 步、儲存設定,並立刻把新網址加到瀏覽器書籤。
命名是這一步最容易被忽略的關鍵。新路徑請避開 login、admin、dashboard、backend 這類一猜就中的字眼,因為稍微聰明一點的攻擊腳本會把這些常見替代詞也列進掃描清單。加上一段隨機字串或數字(例如 entry-x7k2)會明顯增加被猜中的難度。
如果你不想用 WPS Hide Login,部分綜合型安全外掛也內建相同功能。例如 WP Cerber 的設定裡可以「關閉 /wp-admin/ 自動轉址到登入頁」、填入自訂登入網址,並開啟「對 wp-login.php 的直接存取一律回傳 404」。原則上同一個網站只裝一支負責改登入網址的外掛就好,多支同類外掛一起跑容易互相打架,反而把自己鎖在外面。
不靠外掛,用 .htaccess 或 Nginx 改寫登入路徑
如果你偏好少裝外掛、直接從伺服器設定下手,改登入網址也可以靠改寫規則完成。原理其實跟外掛一樣,只是把攔截動作搬到 Web 伺服器層。
Apache 主機是改網站根目錄的 .htaccess。在 # BEGIN WordPress 區塊之外加入一行改寫規則,把自訂路徑導向真正的登入程式:
RewriteRule ^my-entry-8821/?$ /wp-login.php [QSA,L]
這樣輸入 網域/my-entry-8821 會打開登入頁,而直接輸入 wp-login.php 的人若搭配後面會講的存取限制,就會被擋掉或轉走。
Nginx 主機則沒有 .htaccess,要改的是站台的設定檔(通常在 server 或 location 區塊),用 rewrite 指令達成同樣的轉址,改完需要重新載入 Nginx 設定才會生效。
不論外掛或手動改寫,有一個共通的陷阱:快取。如果你裝了頁面快取外掛(例如 Hyper Cache、WP Super Cache 之類),一定要把新的登入路徑加進「不快取」名單,否則登入頁可能被快取成靜態頁,導致登入行為異常或表單送不出去。以 Hyper Cache 為例,要在「過濾」設定裡的「拒絕的位址」加入你的新路徑,路徑前面記得加上斜線。
在伺服器層限制 wp-admin 只允許特定 IP 存取
這是比改網址更硬的一道鎖。核心觀念是:在請求進入 WordPress 之前,先由 Web 伺服器檢查來源 IP,只放行白名單上的位址,其餘一律拒絕或轉走。這麼做的好處是,攻擊根本碰不到 PHP 與資料庫,連消耗資源的機會都沒有。
Apache 主機用 .htaccess 鎖定來源 IP
Apache 環境最常見的做法是針對 wp-login.php 這個檔案設限。在網站根目錄的 .htaccess 加入以下區塊,把 IP 換成你自己的固定 IP:
<Files wp-login.php>
Order deny,allow
Deny from all
Allow from 你的IP位址
</Files>
要放行多個地點,就再加幾行 Allow from,每個 IP 一行。如果連整個 /wp-admin 目錄也要鎖,可以在 wp-admin 資料夾內另外放一個 .htaccess,用改寫規則把非白名單 IP 一律轉回首頁:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REMOTE_ADDR} !^你的IP位址
RewriteRule .* http://你的首頁網址/ [R,L]
</IfModule>
這樣設定後,只要來源不是你的 IP,想開後台都會被自動導回首頁;就算對方直接打 wp-login.php,沒在白名單上也無法通過。
動態 IP 的人可以放寬到網段比對。家用寬頻的 IP 通常前兩段固定、後兩段變動,把比對條件改成只看前兩段(例如 !^118.165.),就能在 IP 浮動時仍維持登入能力,代價是放行的範圍變大、精準度下降。
Nginx 主機用設定檔限制 location
Nginx 不吃 .htaccess,要在站台設定檔的對應 location 區塊裡用 allow 與 deny 控制:
location /wp-admin/ {
allow 你的IP位址;
deny all;
}
location = /wp-login.php {
allow 你的IP位址;
deny all;
}
deny all 放在最後,確保沒被明確允許的來源全部擋下。同樣可以加多行 allow 放行多個 IP。改完設定檔後務必先測試語法再重新載入服務,設定有誤可能導致整站無法存取。
用安全外掛做 IP 白名單
如果完全不想碰設定檔,部分安全外掛(例如 Patchstack、WP Cerber 這類)也提供登入 IP 白名單功能,在後台介面輸入允許的 IP 即可,通常支援單一 IP、萬用字元、CIDR 網段、區間等多種寫法。它的設定門檻最低,但本質上仍是在 WordPress 應用層判斷,防護強度與深度略遜於伺服器層的 .htaccess 或 Nginx 規則——請求還是進到了 PHP,只是被外掛攔下。對非技術背景的管理者來說,這是可接受的折衷。
用 Cloudflare 或反向代理時,IP 限制要注意真實來源
如果你的網站走 Cloudflare、其他 CDN 或反向代理,直接用 .htaccess 的 REMOTE_ADDR 比對 IP 很可能整個失效。原因是經過代理之後,伺服器看到的來源 IP 是代理節點的 IP,而不是訪客的真實 IP,於是你的白名單條件永遠對不上,結果不是把所有人都擋掉,就是形同虛設。
正確的訪客 IP 通常被放在 X-Forwarded-For 或 CF-Connecting-IP 這類標頭裡。在這種架構下,IP 限制更建議放到代理層本身去做——例如直接在 Cloudflare 的防火牆規則裡,設定只有特定 IP 才能存取 /wp-admin* 與 /wp-login.php,其餘回傳封鎖或挑戰頁。這樣判斷發生在最外層,既準確又能在流量打到主機前就過濾掉。
這也是為什麼在規劃 IP 限制前,要先確認自己的流量架構:是直接打到主機,還是中間隔了一層 CDN 或代理。架構不同,設限的位置與用的標頭就不同,搞錯位置輕則無效、重則把自己鎖在外。
隱藏與限制都做了,為什麼還不夠
改網址與鎖 IP 都屬於「降低被攻擊機率」的手段,而不是「保證攻不破」。隱藏登入網址本質是模糊化:它讓盲掃的機器人撲空,但只要有人從你的瀏覽器歷史、書籤、不小心外流的截圖,甚至某些外掛產生的連結中得知新網址,模糊化就失效了。它能把暴力登入次數從每天上萬壓到趨近於零,卻不能取代帳號本身的防護。
所以隱藏路徑與 IP 限制應該被當成「外圍防線」,內層仍要有真正的存取控制:
- 強密碼與專屬帳號:每個管理者用獨立帳號,避免共用
admin這種預設使用者名稱。 - 雙因素驗證(2FA):就算路徑外流、密碼被猜中,沒有第二道驗證碼仍進不來。這是隱藏路徑擋不住人為攻擊時的最後防線。
- 登入失敗鎖定:搭配限制登入次數的機制,連續失敗就暫時封鎖該 IP,進一步壓低暴力破解的可行性。
還有兩個容易被忽略的破口。第一,隱藏 wp-login.php 不一定能擋住 xmlrpc.php 與 REST API 的登入驗證——這兩條路徑各自獨立,若用不到 XML-RPC,建議直接關閉它,REST API 則視需求限制未授權存取。第二,隱藏登入頁不影響 admin-ajax.php 等前台也會用到的端點,別誤以為改了登入網址就把整個後台相關的入口都封死了。把這些一起納入規劃,防線才完整。
萬一把自己鎖在門外,要怎麼救回來
這是動手前最該先想好的退路。改網址或鎖 IP 最常見的意外,就是設定完忘記新網址、或自己的 IP 變了,結果連自己都進不去。好消息是這些幾乎都救得回來,前提是你能用 FTP、SFTP 或主機商的檔案管理器碰到網站檔案。
忘記自訂登入網址(外掛造成):用 FTP 連到網站,進入 wp-content/plugins,把 WPS Hide Login(或你用的同類外掛)資料夾改名或刪除。外掛一旦被停用,WordPress 會自動恢復成預設的 wp-login.php,你就能用原本的網址登入,再重新設定。
被 .htaccess 的 IP 限制鎖在外:用 FTP 找到你加了限制規則的 .htaccess(網站根目錄或 wp-admin 內),把你加上去的那段 <Files> 或 <IfModule> 規則刪掉、存回去,限制就解除了。若是用安全外掛設的白名單,則同樣用上面停用外掛資料夾的方式處理。
Nginx 設定鎖死:這通常發生在能 SSH 登入主機的情境,把設定檔裡的 allow / deny 區塊註解掉或移除,重新載入 Nginx 即可。
預防永遠比救援省事。動手前先做兩件事:把要改的 .htaccess 或設定檔下載一份備份到本機;改完立刻用無痕視窗測一次新網址能不能正常登入、舊網址是否如預期被擋。確認沒問題,再把新網址記進密碼管理器,而不是只靠記憶。
從藏入口到鎖來源,該怎麼安排這幾道防線
把後台入口藏起來、再對來源設限,本質是同一件事的兩個層次:讓無意義的攻擊請求在打到你的登入程式之前就消失。改登入網址負責讓自動化機器人撲空,適合多人、地點不固定的網站;限制 wp-admin 來源 IP 負責擋住知道網址甚至握有帳密的人,適合固定地點、少數管理者的情境。兩者疊加,再以強密碼、雙因素驗證、登入鎖定作為內層核心,才是經得起長期暴力嘗試的後台。
真正要動手前,先確認三件事:你的主機是 Apache 還是 Nginx、流量有沒有經過 Cloudflare 之類的代理、以及你能不能用 FTP 碰到檔案以備不時之需。把退路準備好、改完立刻用無痕視窗驗證一次,你就能放心地把那個眾所皆知的登入入口從攻擊者的雷達上抹掉。