在進行網站安全掃描時,常會發現一個容易被忽視的風險:直接存取 WordPress 主題目錄下的 PHP 檔案(如 index.php),會觸發 Call to undefined function get_header() 致命錯誤。若伺服器設定為顯示錯誤訊息,完整的伺服器路徑結構便會暴露在瀏覽器中,雖然不影響正常瀏覽,卻為惡意掃描提供了寶貴的偵察情報。本文將分享如何徹底關閉錯誤顯示,並導向首頁避免流量流失的完整解決方案。
環境為 Linux VPS + LNMP 架構。當直接造訪 /wp-content/themes/twentytwelve/index.php 時,PHP 引擎拋出錯誤:
Fatal error: Call to undefined function get_header() in /網站根路徑/izhangheng/wp-content/themes/twentytwelve/index.php on line 10
錯誤訊息完整揭露了實體路徑 /網站根路徑/izhangheng/,這對資安檢測來說屬於資訊洩漏漏洞。後台日誌顯示每天都有大量掃描嘗試存取各類路徑與檔案,堵住這類洩漏能顯著提升防禦深度。
若應用程式本身具備錯誤處理機制(如 WordPress 的 WP_DEBUG),優先確保其關閉。若無,需依環境分別設定:
display_errors = Offphp_flag display_errors offini_set('display_errors', 0);筆者環境預設已關閉 display_errors,但為了雙重保險,仍建議在程式碼層面再次強制關閉。
單純隱藏錯誤會讓使用者看到空白頁,體驗極差。更好的做法是:在主題模板(如 index.php、single.php)最頂端,先關閉錯誤顯示,再判斷 WordPress 核心函數是否存在;若不存在(代表被直接呼叫),立即 302 導向首頁。
<?php
ini_set('display_errors', 0);
?>
<?php
/**
* @package WordPress
* Security hardening: prevent direct file access
*/
if (function_exists('get_header')) {
get_header();
} else {
header("Location: https://" . $_SERVER['HTTP_HOST'] . "/");
exit;
}
?>
關鍵點說明:
ini_set('display_errors', 0) 必須在輸出任何內容前執行。function_exists('get_header') 偵測 WordPress 環境是否已載入。header("Location: ...") 導向網站根目錄,保留流量並隱藏結構。部署後再次掃描,原本洩漏路徑的漏洞消失,安全評分可達 100 分(表面層級)。資安是持續攻防,發現一個、修補一個,才能構建纵深防禦體系。