首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP Include 路徑加密隱藏實際腳本位置技巧

     編輯:PHP 相關知識

PHP Include 路徑加密隱藏實際腳本位置技巧

透過中介腳本解密路徑參數並動態 include,可隱藏實際 PHP 檔案路徑,增加攻擊者偵測架構難度。本文實作一個基礎版路徑加密 Include 機制並分析其安全性限制。

核心架構

  1. 前端:所有連結/表單指向單一入口 index.php,攜帶加密路徑參數
  2. 中介腳本 (router.php):解密參數、驗證路徑合法性、切換工作目錄、include 目標檔案
  3. 加密/解密函數:可逆加密演算法 (如 AES、自定義 XOR+Base64)

1. 入口檔 index.php

<?php
// 統一入口,載入路由器
require_once __DIR__ . '/router.php';

2. 路由器 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;

3. 加密解密類 Base.php (簡易示範版)

<?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);
    }
}

4. 前端連結與表單產生方式

<?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);
?>

5. 基底路徑處理 (前端資源)

HTML 頁面中的 CSS/JS/圖片路徑需使用相對路徑或設定 <base href="/public/">,避免因入口統一導致資源載入失敗。

安全性分析與限制

防護面向效果備註
隱藏實際檔案路徑中瀏覽器網址列只見 index.php?xxx,但開發者工具仍可分析
防止直接存取 PHP 檔案高搭配 .htaccess 拒絕 app 目錄直接存取更完善
防止路徑遍歷攻擊高realpath() + 基底目錄前綴驗證為核心防線
防止遠端檔案包含 (RFI)高禁止 https://、https:// 協定前綴
防止本地檔案包含 (LFI)中白名單機制優於黑名單,建議建立允許路徑對照表
CSRF 防護無需額外實作 Token 驗證

現代框架的做法 (參考)

Laravel、Symfony、ThinkPHP 等框架採用 單一入口 + 路由解析 + 控制器/動作對應,而非動態 include 檔案路徑。核心差異:

  • 路由對應到類別方法,而非檔案路徑
  • 中介軟體管線處理驗證、授權、CSRF、限流
  • 視圖渲染分離,不直接 include PHP 檔案輸出 HTML

建議

  1. 新專案直接採用成熟框架,勿自行實作路由機制。
  2. 維護舊專案時,以 realpath() + 白名單陣列驗證路徑為核心防線,加密參數僅為混淆非核心防護。
  3. 配合 Apache Require all denied 保護應用目錄、open_basedir 限制 PHP 存取範圍。

路徑加密 Include 屬於「混淆層」防護,無法替代輸入驗證、權限控制等核心安全機制,請謹慎評估成本效益。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved