透過中介腳本解密路徑參數並動態 include,可隱藏實際 PHP 檔案路徑,增加攻擊者偵測架構難度。本文實作一個基礎版路徑加密 Include 機制並分析其安全性限制。
index.php,攜帶加密路徑參數<?php // 統一入口,載入路由器 require_once __DIR__ . '/router.php';
<?php // 載入基礎類別與加密函數 require_once __DIR__ . '/include/Base.php'; $path = ''; $encrypted = $_SERVER['QUERY_STRING'] ?? ''; // GET 參數解密 if (!empty($encrypted)) { $decrypted = Base::decrypt(urldecode($encrypted)); parse_str($decrypted); // 解析成變數,包含 $path } // POST 參數解密 (表單隱藏欄位) if (!empty($_POST['path'])) { $path = Base::decrypt(urldecode($_POST['path'])); } // 驗證路徑安全性 if (empty($path)) { header('Location: login.php'); exit; } // 防止路徑遍歷與遠端包含 if (preg_match('/(^https?:)|[?&|=]/', $path)) { die('非法路徑參數'); } // 限制只能包含專案內檔案 $baseDir = realpath(__DIR__ . '/../app'); // 實際應用目錄 $targetPath = realpath($baseDir . '/' . $path); if ($targetPath === false || strpos($targetPath, $baseDir) !== 0) { die('存取被拒絕:路徑超出允許範圍'); } // 切換工作目錄並包含 chdir(dirname($targetPath)); include_once basename($targetPath); exit;
<?php class Base { private static $key = 'your-32-char-secret-key-here!!'; // 實際應用請用環境變數 public static function encrypt($data) { $iv = random_bytes(16); $ciphertext = openssl_encrypt($data, 'AES-256-CBC', self::$key, OPENSSL_RAW_DATA, $iv); return base64_encode($iv . $ciphertext); } public static function decrypt($data) { $raw = base64_decode($data); if (strlen($raw) < 16) return ''; $iv = substr($raw, 0, 16); $ciphertext = substr($raw, 16); return openssl_decrypt($ciphertext, 'AES-256-CBC', self::$key, OPENSSL_RAW_DATA, $iv); } }
<?php require_once 'include/Base.php'; // 產生連結 $params = 'path=/module/user/profile.php&user_id=123&tab=settings'; $encrypted = Base::encrypt($params); echo '<a href="index.php?' . urlencode($encrypted) . '">使用者設定</a>'; // 表單隱藏欄位 $formPath = '/module/order/create.php'; $encryptedPath = Base::encrypt($formPath); ?>
HTML 頁面中的 CSS/JS/圖片路徑需使用相對路徑或設定 <base href="/public/">,避免因入口統一導致資源載入失敗。
| 防護面向 | 效果 | 備註 |
|---|---|---|
| 隱藏實際檔案路徑 | 中 | 瀏覽器網址列只見 index.php?xxx,但開發者工具仍可分析 |
| 防止直接存取 PHP 檔案 | 高 | 搭配 .htaccess 拒絕 app 目錄直接存取更完善 |
| 防止路徑遍歷攻擊 | 高 | realpath() + 基底目錄前綴驗證為核心防線 |
| 防止遠端檔案包含 (RFI) | 高 | 禁止 https://、https:// 協定前綴 |
| 防止本地檔案包含 (LFI) | 中 | 白名單機制優於黑名單,建議建立允許路徑對照表 |
| CSRF 防護 | 無 | 需額外實作 Token 驗證 |
Laravel、Symfony、ThinkPHP 等框架採用 單一入口 + 路由解析 + 控制器/動作對應,而非動態 include 檔案路徑。核心差異:
realpath() + 白名單陣列驗證路徑為核心防線,加密參數僅為混淆非核心防護。Require all denied 保護應用目錄、open_basedir 限制 PHP 存取範圍。路徑加密 Include 屬於「混淆層」防護,無法替代輸入驗證、權限控制等核心安全機制,請謹慎評估成本效益。