【實測分享】徹底解決 WordPress 國家阻擋:直接在 wp-config.php 築起最強防護牆
身為 WordPress 網站管理員,為了擋住來自特定國家的暴力破解攻擊,我們通常會安裝 IP2Location Country Blocker 等地理位置封鎖外掛。
但你是否發現:明明設定了阻擋,某些國家的訪客(如墨西哥 Mega Cable)卻依然能看到後台登入頁面?
為什麼外掛會「攔截失效」?
- 快取攔截:大部分外掛運作在 WordPress 載入後期。如果你有使用 Cache 或 Rocket,伺服器會直接吐出靜態頁面,導致 PHP 外掛根本沒機會執行。
- 加載順位:外掛加載時,攻擊腳本可能已經完成初步掃描。
最強解法:在「第一關」就把門鎖死
直接在 wp-config.php 寫入邏輯,借用 IP2Location 外掛已有的資料庫,在 WordPress 核心啟動前就完成身分驗證。這是在 PHP 層級所能做到最高效率的攔截。
🛠️ 實戰代碼:白名單防禦機制
這段代碼的運作原理:只允許特定國家(如台灣、日本)與指定固定 IP 進入後台,其餘通通封鎖。
/* --- [ipinfo.io 雲端識別版] 僅限特定地區訪問後台 --- */
// 檢查是否為系統路徑,使用斜線與關鍵字組合以精準匹配
if (
strpos($_SERVER['REQUEST_URI'], '/wp-login.php') !== false ||
strpos($_SERVER['REQUEST_URI'], '/wp-admin/') !== false ||
strpos($_SERVER['REQUEST_URI'], '/xmlrpc.php') !== false
) {
// 1. 取得訪客 IP (採用最穩定的字串處理,預防 PHP 8 錯誤)
$v_ip = $_SERVER['REMOTE_ADDR'];
if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] !== '') {
$ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$v_ip = trim((string)$ips[0]); // 關鍵修正:明確指定索引並轉為字串
}
// 2. 【優先白名單】固定 IP 直接放行
$trusted = array('::1', '127.0.0.1', '123.123.123.123');
if (in_array($v_ip, $trusted)) {
// 放行,不執行後續 cURL 節省資源
} else {
// 3. 採用您成功的 ipinfo.io 範例邏輯
$country = '未知';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://ipinfo.io/{$v_ip}/json");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
$response = curl_exec($ch);
curl_close($ch);
if ($response !== false) {
$data = json_decode($response, true);
if (!empty($data['country'])) {
$country = strtoupper($data['country']);
}
}
// 4. 判斷國家白名單 (台灣、日本)
$allowed = array('TW', 'JP');
if (!in_array($country, $allowed)) {
header('HTTP/1.1 403 Forbidden');
header('Content-Type: text/html; charset=utf-8');
exit("存取被拒:您所在的國家 ($country) 未經授權訪問。您的 IP: $v_ip");
}
}
}
/* --- 結束 --- */
💡 為什麼這個作法更強大?
- 突破快取:寫在 wp-config.php 優先級最高,快取外掛還沒啟動前就已經攔截完成。
- 節省資源:不符合條件的請求會立即中斷,不需載入完整的 WordPress 核心檔案。
- 自動容錯:內建檔案檢查,萬一解除外掛,網站也不會因為找不到檔案而報錯。
對於網站安全防護,「拒敵於國門之外」永遠是最高準則。如果你也被頻繁的跨國攻擊困擾,試試這個防線前移的終極方案吧!
