當前位置: 首頁> 最新文章列表> show_source函數在使用過程中是否存在路徑遍歷攻擊的安全隱患?如何防範?

show_source函數在使用過程中是否存在路徑遍歷攻擊的安全隱患?如何防範?

gitbox 2025-06-10

在PHP中, show_source()函數(別名為highlight_file() )用於以帶有語法高亮的格式顯示指定文件的源代碼。它常被用於調試或展示代碼片段。然而,如果在調用show_source()時未對輸入路徑進行嚴格驗證,就可能引發路徑遍歷攻擊,從而導致敏感文件洩露,造成嚴重安全隱患。

路徑遍歷攻擊是什麼?

路徑遍歷攻擊是指攻擊者通過操縱文件路徑參數,訪問服務器上原本不應公開的文件。攻擊者通常使用類似../的目錄跳轉符號,繞過訪問限制,讀取系統敏感文件(如/etc/passwd 、配置文件、數據庫連接信息等),造成信息洩露。

show_source函數中的安全隱患

示例代碼:

 <?php
if (isset($_GET['file'])) {
    show_source($_GET['file']);
}
?>

如果沒有對$_GET['file']的輸入進行過濾,攻擊者可以通過如下請求訪問任意文件:

 http://gitbox.net/script.php?file=../../../../etc/passwd

這樣會導致服務器直接輸出/etc/passwd文件內容,造成嚴重信息洩露。

如何防範路徑遍歷攻擊?

  1. 限定訪問目錄<br> 只允許訪問預設目錄中的文件例如,將允許訪問的文件目錄定義為/var/www/html/sources/ ,任何請求都必須在該目錄下查找:

 <?php
$baseDir = '/var/www/html/sources/';
if (isset($_GET['file'])) {
    $file = basename($_GET['file']);  // 僅保留文件名,避免目錄穿越
    $path = realpath($baseDir . $file);
    if ($path !== false && strpos($path, $baseDir) === 0 && is_file($path)) {
        show_source($path);
    } else {
        echo "非法文件路徑!";
    }
}
?>
  1. 過濾和驗證輸入

    • 使用basename()函數移除路徑中的目錄信息。

    • 結合realpath()驗證文件的真實路徑,確保文件位於指定目錄中。

    • 驗證文件存在且是普通文件。

  2. 禁用用戶直接傳入路徑<br> 最好通過預定義的文件列表或者ID映射表來確定要展示的文件,而不是讓用戶直接傳遞文件路徑

  3. 關閉危險函數顯示<br> 在生產環境中,盡量避免公開源碼顯示功能,或者設置權限限制,防止未經授權訪問

總結

show_source()函數本身並不帶有安全漏洞,但如果不謹慎處理輸入路徑,容易導致路徑遍歷攻擊,洩露服務器敏感信息。防範關鍵在於嚴格驗證用戶輸入的路徑,限製文件訪問範圍,避免任意路徑被傳入執行。通過上述措施,可以有效防止路徑遍歷攻擊,保障系統安全。