一個 <?php ... ?> 即可部署的輕量級文件管理器,支援目錄樹導航、文件內容編輯 (代碼高亮建議前端 JS 實現)、刪除確認、新建文件/目錄、重命名。適合無 FTP/SSH 權限時的緊急文件操作。生產環境嚴禁直接部署,極高風險!
| 動作 | 參數 | 功能 |
|---|---|---|
| 默認 | - | 列表當前目錄,顯示類型、大小、操作鏈接 |
?folder=subdir | 相對路徑 | 進入子目錄 |
?action=edit&type=file&path=... | 文件路徑 | 讀取文件內容到 textarea 編輯 |
?action=edit&type=dir&path=... | 目錄路徑 | 重命名目錄表單 |
?action=editsave&path=... | POST textarea | 保存編輯內容 |
?action=del&type=file|dir&path=... | 路徑 | 刪除文件/空目錄 (JS 確認) |
?action=addfile&path=... | 目錄路徑 | 新建文件/目錄表單 (含內容) |
?action=filesave | POST filename, textarea | 創建文件 (含點) 或目錄 (無點) |
?action=dir_rename | POST filename | 重命名目錄 |
$s = explode("\n", trim(`dir /b /o:gn $path`)); // Windows dir 命令獲取列表
foreach ($s as $value) {
$full = $path . '\\' . $value;
$isDir = is_dir($full);
$link = $isDir ? "<a href='?folder=" . urlencode($relPath . '\\' . $value) . "'>$value</a>" : $value;
echo "<tr><td>$link</td><td>" . ($isDir ? 'dir' : 'file') . "</td><td>" . round(filesize($full)/1024) . "kb</td>";
echo "<td><a href='?action=edit&path=$full&type=" . ($isDir?'dir':'file') . "'>編輯</a> | ";
echo "<a href='?action=del&path=$full&type=" . ($isDir?'dir':'file') . "' onclick=\"return confirm('確定刪除 $value')\">刪除</a></td></tr>";
}
// 讀取
$file = fopen($path, 'r');
while (!feof($file)) $content .= fgets($file, 9999);
fclose($file);
// 保存
$file = fopen($path, 'w');
fwrite($file, $_POST['textarea']);
fclose($file);
$path = realpath($path); if (strpos($path, $ROOT) !== 0) die('Access denied');if (!isset($_SERVER['PHP_AUTH_USER']) || !valid($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'])) { header('WWW-Authenticate: Basic realm="File Manager"'); header('HTTP/1.0 401 Unauthorized'); exit; }.php、.phtml、.htaccess 等建議只讀或禁止編輯。<?php
// 1. 配置區
$ROOT = realpath(__DIR__); // 限制根目錄
$AUTH_USER = 'admin';
$AUTH_PASS = password_hash('strong_password', PASSWORD_DEFAULT); // 預存哈希
// 2. 基礎驗證
if (!isset($_SERVER['PHP_AUTH_USER']) || $_SERVER['PHP_AUTH_USER'] !== $AUTH_USER || !password_verify($_SERVER['PHP_AUTH_PW'], $AUTH_PASS)) {
header('WWW-Authenticate: Basic realm="File Manager"');
header('HTTP/1.0 401 Unauthorized');
exit('Unauthorized');
}
// 3. 路徑安全
$reqPath = isset($_GET['path']) ? realpath($_GET['path']) : $ROOT;
if ($reqPath === false || strpos($reqPath, $ROOT) !== 0) exit('Invalid path');
// ... 後續業務邏輯使用 $reqPath
?>
單文件管理器適合臨時救急,長期維護請用成熟工具。