WordPress 後台檔案編輯停用——縮小後門植入面

WordPress 後台「外觀 → 佈景主題檔案編輯器」與「外掛 → 外掛檔案編輯器」是兩個很方便、卻也很危險的功能。它讓管理員不必碰 FTP,就能直接在瀏覽器裡改 PHP 檔案。問題在於,這份權限不是只屬於你——只要有人拿到任何一組管理員帳密,就能用同一個編輯器,把一段惡意 PHP 寫進佈景主題或外掛裡,留下長期潛伏的後門。

絕大多數教學講到這裡就停在「在 wp-config.php 加一行 DISALLOW_FILE_EDIT」。這只關掉了「從後台改檔」這一條路,卻沒處理另一條更常被利用的攻擊面:攻擊者把 webshell 上傳到 wp-content/uploads/,再直接用網址呼叫它執行。真正要縮小後門植入面,得把「停用後台檔案編輯」和「限制 PHP 執行位置」一起做。

這篇會說明 WordPress 後台檔案編輯停用該怎麼設定、DISALLOW_FILE_EDITDISALLOW_FILE_MODS 的差別、如何禁止 uploads 目錄執行 PHP(Apache 與 Nginx 都給設定),以及這些設定擋得了什麼、擋不了什麼。

後台檔案編輯器為什麼是高風險的後門入口

後台檔案編輯器之所以危險,是因為它把「寫入伺服器 PHP 檔案」的能力,綁在了「登入後台」這個門檻上。一旦這個門檻被突破,編輯器就成了現成的植入工具。

WordPress 內建兩個這類編輯器,位置依佈景主題型態而不同。傳統佈景主題在「外觀 → 佈景主題檔案編輯器」與「外掛 → 外掛檔案編輯器」;區塊佈景主題(使用站台編輯器)則移到「工具」底下的「佈景主題檔案編輯器」與「外掛檔案編輯器」。不論在哪,它們做的事一樣:讓擁有 edit_themesedit_plugins 權限的使用者,直接讀寫站台的 PHP 原始碼。

攻擊鏈通常是這樣:攻擊者透過暴力破解、外洩的密碼、或某個外掛漏洞,先拿到一組管理員身分;接著打開佈景主題編輯器,挑一個幾乎不會被注意的檔案(例如佈景主題的 404.php 或某個函式庫檔),貼進一段能接收外部指令的 PHP,存檔。從這一刻起,他不再需要登入後台——只要用瀏覽器存取那個被汙染的檔案網址,就能執行任意指令。這就是所謂的「後門」:一個繞過正常驗證、長期保留的遠端進入點。

停用後台檔案編輯不會讓你失去改檔能力。你或你的開發者,仍然可以透過 SFTP、SSH 或主機控制台的檔案管理員去改任何佈景主題與外掛檔。你拿掉的只是「瀏覽器裡的捷徑」,而那條捷徑對攻擊者的價值,遠大於對你的價值。

DISALLOW_FILE_EDIT 怎麼設定才會生效

最可靠的做法是在 wp-config.php 裡定義 DISALLOW_FILE_EDIT 常數,這是 WordPress 官方支援的設定,不依賴任何外掛,更新核心後也不會被覆寫。

wp-config.php 位於 WordPress 安裝的根目錄,通常在主機的 public_html 或其子資料夾裡。動手前先用 SFTP 或主機檔案管理員下載一份備份,避免改壞了沒有退路。打開檔案後,往下找到這一行:

/* That's all, stop editing! Happy blogging. */

在這一行的上方加入:

define( 'DISALLOW_FILE_EDIT', true );

存檔後(用 SFTP 的話要重新上傳)回到後台,檢查上一節提到的編輯器位置。如果「佈景主題檔案編輯器」與「外掛檔案編輯器」的連結都消失了,就代表生效了,即使用管理員帳號登入也看不到。

設定要放在 require_once ABSPATH . 'wp-settings.php'; 這一行之前,這也是為什麼要加在「stop editing」註解上方——加到那行之後等於沒定義,常數不會被讀到。

設定後編輯器還在的常見原因

如果改完編輯器連結還在,依序檢查這幾點。第一、清掉瀏覽器快取與站台快取,許多快取外掛會把後台選單一起快取住。第二、確認你改的是正在運作的那個 wp-config.php,有些主機有多份或有暫存版本。第三、檢查語法,少一個分號、引號用成全形、或誤用了智慧引號,都會讓整行失效,甚至讓網站出現錯誤。第四、確認沒有安全外掛或自訂程式碼,又把這個設定覆寫回去——部分安全外掛(例如 Sucuri、Wordfence 一類)有自己的開關,會在儲存設定時重新寫入這個值。

需要還原時把設定註解掉

wp-config.php 控制的好處是還原很乾淨。要恢復編輯器時,與其刪掉整行,建議改成註解:

// define( 'DISALLOW_FILE_EDIT', true );

存檔後編輯器就會回來。改完急用時拿掉註解最快,用完把斜線補回去即可,不必重打整行、降低打錯的機會。

DISALLOW_FILE_EDIT 與 DISALLOW_FILE_MODS 差在哪

兩個常數的差別在「鎖的範圍」:DISALLOW_FILE_EDIT 只關掉後台的檔案編輯器;DISALLOW_FILE_MODS 則連帶封掉所有從後台進行的檔案異動,是更嚴格的一層。

具體來說,啟用 DISALLOW_FILE_MODS 後,除了編輯器消失,還會擋掉從後台安裝外掛、上傳佈景主題、以及更新外掛、佈景主題與核心。換句話說,即使一個管理員帳號被攻陷,攻擊者也無法透過後台介面塞進惡意外掛或佈景主題壓縮檔——這正是另一種常見的後門植入手法。

行為 DISALLOW_FILE_EDIT DISALLOW_FILE_MODS
後台佈景主題/外掛檔案編輯器 停用 停用
後台安裝、上傳外掛與佈景主題 仍可 停用
後台更新核心、外掛、佈景主題 仍可 停用
透過 SFTP/SSH 改檔與更新 仍可 仍可

設定方式與前一節相同,在 wp-config.php 的「stop editing」註解上方加入:

define( 'DISALLOW_FILE_MODS', true );

DISALLOW_FILE_MODS 的範圍已涵蓋 DISALLOW_FILE_EDIT,所以兩個不必同時設,啟用前者即可。它適合上線後就不常變動、把穩定性與安全性看得比後台便利性更重的正式站;缺點是每次要裝外掛或更新,都得改回設定或改走 SFTP,對更新頻繁的站會比較綁手。

實務上常見的折衷,是平常開著 DISALLOW_FILE_MODS,需要做大版本維護時,暫時把它註解掉、完成後再開回來。決策關鍵是看更新節奏:站台維護愈頻繁,愈可能只用 DISALLOW_FILE_EDIT;愈接近「設定好就不太動」的正式站,愈值得直接上 DISALLOW_FILE_MODS

禁止 uploads 目錄執行 PHP,補上真正的後門出口

關掉後台編輯器,只堵住了一條植入路徑;攻擊者更常用的另一條,是把 PHP 後門透過漏洞上傳到 wp-content/uploads/,再直接用網址呼叫它執行。要縮小後門面,必須讓這個目錄即使被放進 PHP 檔,也無法被執行。

uploads 目錄理應只放圖片、PDF、文件這類媒體檔,沒有任何正當理由要在這裡執行 PHP。設定一道「這個資料夾裡的 PHP 一律不准執行」的規則,等於把上傳型後門的最後一哩——「執行」——直接切斷:檔案就算被放進去了,呼叫它也只會得到拒絕存取,跑不起來。

Apache 主機用 .htaccess 阻擋

如果主機是 Apache(多數共享主機、含 cPanel 環境),在 wp-content/uploads/ 底下新增一個 .htaccess 檔,內容如下:

<Files *.php>
  deny from all
</Files>

這段規則會對該目錄與其所有子目錄裡、副檔名為 .php 的檔案一律拒絕存取。新版伺服器若使用 Apache 2.4,部分環境改用新語法,可改寫為:

<Files *.php>
  Require all denied
</Files>

設定後可以做個簡單驗證:在 uploads 裡放一個只印出文字的測試 .php 檔,用瀏覽器直接開它的網址。若回應的是 403 或拒絕存取、而不是把內容執行出來,就代表規則生效。測試完記得把測試檔刪掉。

Nginx 主機改在站台設定檔加 location 規則

Nginx 不讀 .htaccess,得在站台的伺服器設定檔裡加規則。在對應 server 區塊中加入:

location ~* /wp-content/uploads/.*.php$ {
    deny all;
}

存檔後重新載入 Nginx 設定(例如 nginx -s reload)才會套用。這類設定通常需要主機或伺服器層級的權限,若你用的是受管型主機而無法改設定檔,可以直接請主機商協助加上「uploads 目錄禁止執行 PHP」這一條,多數供應商都熟悉這個需求。

設定前要留意一個例外:少數外掛或快取機制,會在 uploads 底下產生需要被執行的 PHP(這種設計本身不理想,但確實存在)。若擋了之後出現功能異常,先確認是哪個檔被擋,再針對該路徑做例外,而不是整條規則拿掉。

設定完該怎麼確認真的鎖上了

設定容易,但「以為設好了、其實沒生效」才是真正的風險。把停用後台編輯與禁止 uploads 執行 PHP 都做完後,逐項確認一遍,才算真的把面縮小。

確認後台編輯器這一側:用管理員帳號登入,按佈景主題型態到對應位置,確定「佈景主題檔案編輯器」與「外掛檔案編輯器」都看不到。若用了 DISALLOW_FILE_MODS,再到「外掛 → 安裝外掛」確認上傳與安裝鈕也已停用。

確認 uploads 這一側:用上一節的測試 .php 檔,從瀏覽器存取它的完整網址,看到拒絕存取而非執行結果,才算成功,驗證後刪除測試檔。

最後做一次盤點:除了這兩道設定,常被忽略卻同樣有效的是收斂權限。檢查所有使用者角色,只把管理員權限給真正需要的人,其餘給足夠完成工作的最低權限即可。後台檔案編輯與檔案異動,本質上都是綁在高權限帳號上的能力,帳號權限收得愈緊,被攻陷後可植入的面就愈小。

這些設定擋得了什麼、擋不了什麼

把預期說清楚,才不會誤以為做了這幾步就高枕無憂。DISALLOW_FILE_EDIT 與禁止 uploads 執行 PHP,封的是「拿到管理員身分後用編輯器寫後門」和「把 webshell 上傳到 uploads 再執行」這兩條具體路徑,這也是實務上最常見的兩種植入手法。

但它們不是萬靈丹。這些設定擋不了以下情況:攻擊者利用某個外掛或佈景主題本身的程式漏洞,在合法的程式目錄裡執行惡意碼;或透過 DISALLOW_FILE_MODS 未涵蓋的途徑(例如直接拿到 SFTP、SSH 或資料庫權限)改動檔案。也就是說,這幾道設定縮小的是「面」,不是把風險歸零。

正因如此,它們應該被當成多層防護裡的其中一層,而不是全部。搭配一起做才有意義的,至少包括:所有帳號使用夠長、夠獨特的密碼,並開啟兩步驟驗證(2FA);持續更新核心、外掛與佈景主題,把已知漏洞補掉;以及建立可還原的定期備份,並實際測過還原流程,確保真的出事時救得回來。

回到最初的目標:縮小後門植入面,本質是把每一條「能寫入並執行伺服器程式碼」的路徑逐一收窄。停用後台檔案編輯,關掉了最方便被濫用的那條;禁止 uploads 執行 PHP,切斷了上傳型後門的執行點;收緊管理員權限,則讓帳號被攻陷後可動用的能力降到最低。三件事都不難,今天就能在 wp-config.phpuploads 設定裡完成,剩下的就是養成定期更新與備份的習慣,把這層防護長期維持住。

相關文章
標籤: WordPress 資安, DISALLOW_FILE_EDIT, wp-config, 網站後門防護, uploads 安全