虛擬主機常見限制:無法將框架核心文件置於 Web 根目錄外、無法修改 Apache/PHP 配置、無法使用 .htaccess(非 Apache)。FleaPHP 預設結構將 Controller 置於可訪問目錄,存在信息洩露風險。
controller/ 目錄移至 Web 根目錄外層。require 路徑指向新位置。<?php
// 所有 MVC 層文件(除 index.php 入口)頂部強制添加
defined('APP_DIR') or header("HTTP/1.0 404 Not Found"); exit();
// 建議:將常量名改為難以猜測的隨機字符串
define('FLEA_SECRET_KEY', 'xK9#mP2$vL5!'); // 在配置文件定義
// 控制器文件頂部
defined('FLEA_SECRET_KEY') or header("HTTP/1.0 404 Not Found"); exit();
作用:直接訪問控制器文件時,常量未定義,返回 404 偽裝不存在,隱藏框架結構。
controller/ 改為類似 sdfsdf12312SDCVd/Flea/ 的隨機名稱。index.html 防止目錄列表洩露。# 放置於 Web 根目錄
<FilesMatch "\.(php|inc|tpl|sql|log)$">
Order Allow,Deny
Deny from all
</FilesMatch>
# 禁止訪問特定目錄
RedirectMatch 403 ^/(controller|model|view|config|logs)/
修改 FLEA_Exception 構造函數,生產環境禁用堆棧跟蹤輸出:
<?php
class FLEA_Exception extends Exception {
public function __construct($message = null, $code = 0) {
parent::__construct($message, $code);
// 僅記錄日誌,不暴露給用戶
error_log("Exception: $message in " . $this->getFile() . ":" . $this->getLine());
// 移除或註釋掉 debug_backtrace() 相關代碼
}
}
600(僅擁有者讀寫)。include 絕對路徑。display_errors,啟用 log_errors 指定日誌路徑。| 檢查項 | 預期結果 |
|---|---|
| 直接訪問 /controller/UserController.php | 返回 404,無框架信息洩露 |
| 訪問 /config/database.php | 返回 403/404,不顯示源碼 |
| 觸發 PHP 錯誤 | 頁面顯示友好錯誤頁,日誌記錄詳細堆棧 |
| 目錄瀏覽測試 | 所有目錄返回 403 或顯示空 index.html |
在受限環境下,「代碼層面的入口守衛」+「目錄混淆」+「錯誤信息不外露」構成三道防線。雖無法達到專用服務器級別的物理隔離,但能將攻擊面壓縮到最小,滿足大多數虛擬主機項目的安全合規要求。