本文為「使用 PHP 實現高效安全 FTP 服務器」系列第二部分,重點剖析四大核心類的設計與實現:User(用戶/權限管理)、ShareMemory(共享內存)、CWebServer(內嵌 HTTP 管理後台)、CFtpServer(FTP 主邏輯)。第一部分請參考《基於 Swoole 實現高效安全 FTP 服務器(一):協議與架構設計》。
User採用 JSON 文件存儲,分離用戶表(users)與組表(groups),支援多層級權限繼承。
// 用戶記錄結構
[
'user1' => [
'pass' => 'md5_hash', // 密碼鹽值哈希
'group' => 'group1', // 所屬組
'home' => '/home/ftp/', // FTP 根目錄
'active' => true, // 啟用狀態
'expired' => '2025-12-31', // 過期時間
'description'=> '', // 備註
'email' => 'user@example.com', // 郵箱
'folder' => [ // 目錄精細權限
['path' => '/home/ftp/', 'access' => 'RWANDLCNDI'],
['path' => '/home/ftp/a/', 'access' => 'RWAND-----']
],
'ip' => [ // IP 白/黑名單
'allow' => ['192.168.1.*'],
'deny' => ['10.0.0.5']
]
]
]
// 組記錄結構
[
'group1' => [
'home' => '/home/ftp/dept1/',
'folder' => [...], // 同用戶 folder 結構
'ip' => [...]
]
]
| 位 | 字符 | 含義 | 類別 |
|---|---|---|---|
| 0 | R | 讀取/下載文件 | 文件權限 |
| 1 | W | 寫入/上傳新文件 | |
| 2 | A | 追加/斷點續傳 | |
| 3 | N | 重命名文件 | |
| 4 | D | 刪除文件 | |
| 5 | L | 列出目錄 | 目錄權限 |
| 6 | C | 創建子目錄 | |
| 7 | N | 重命名子目錄 | |
| 8 | D | 刪除子目錄 | |
| 9 | I | 繼承父目錄權限 | 子目錄權限 |
權限字符串示例:RWANDLCNDI 表示擁有所有權限;RWAND----- 僅擁有文件權限,無目錄操作權限。
addUser() / setUserProfile() / delUser():用戶增刪改addGroup() / setGroupProfile() / delGroup():組管理checkUser($user, $pass, $ip):綜合驗證(密碼、過期、IP 白黑名單)getPathAccess($user, $path):最長路徑匹配獲取權限,支援繼承邏輯isReadable()/isWritable()/isFolderListable()...:具體權限判斷快捷方法addOnline() / addAttempt() / isAttemptLimit():基於共享內存的在線用戶統計與暴力破解防護ShareMemory封裝 shmop 擴展,提供進程間數據共享(在線用戶、Pasv 端口佔用、登錄失敗記錄)。
class ShareMemory {
private $mode = 0644;
private $shm_key;
private $shm_size = 1048577; // 1MB + 1 byte 結束符
public function __construct() {
$this->shm_key = ftok(__FILE__, 'F');
}
public function read() { /* 讀取並 json_decode */ }
public function write(array $arr) { /* json_encode 寫入 */ }
public function delete() { /* 刪除共享內存塊 */ }
}
關鍵點:以 \0 作為字符串結束標記;寫入前檢查大小不超過分配空間;讀取時自動截斷結束符後內容。
CWebServer基於 Swoole 實現的輕量級 HTTP 服務,專為 FTP 管理介面設計,支援靜態文件、PHP 腳本執行、Basic Auth 驗證、緩存控制。
onReceive 接收數據 → checkData 判斷請求頭/體完整性parseHeader 解析請求行與 HeaderscheckPost 處理 POST 體長度驗證(防大包攻擊)parseRequest 填充 $_GET/$_POST/$_COOKIE/$_SERVER 等超全局變量process 路由分發:PHP 文件經 include 執行,靜態文件直接輸出parseResponse 組裝 HTTP 響應頭與體發送path_deny 禁止訪問 /protected/ 等敏感目錄admin 組用戶訪問Cache-Control,支援 If-Modified-Since 304 響應CFtpServer繼承 Swoole 事件驅動模型,整合上述組件,實現完整 FTP 協議邏輯(RFC 959/2228/2389/3659)。
// 啟動腳本入口
CFtpServer::setPidFile('/var/run/ftp_server.pid');
CFtpServer::start(function() {
$server = new CFtpServer('0.0.0.0', 21);
$server->daemonize(); // 守護進程模式
$server->run([
'worker_num' => 4,
'max_connection' => 500,
'manager_port' => 8080, // HTTP 管理端口
'ftps_port' => 990, // FTPS 隱式 SSL 端口
'passive_port_range' => [55000, 60000],
'ssl_cert_file' => '/etc/ssl/ftp_server.pem',
'ssl_key_file' => '/etc/ssl/ftp_server.key',
'force_ssl' => false, // 強制 FTPS
'log_file' => '/var/log/ftp_server.log',
'pid_file' => '/var/run/ftp_server.pid',
]);
});
| 命令 | 方法 | 功能說明 |
|---|---|---|
| USER / PASS | cmd_USER / cmd_PASS | 用戶認證,支援 IP 白黑名單、失敗鎖定 |
| CWD / CDUP / PWD | cmd_CWD / cmd_CDUP / cmd_PWD | 目錄切換與查詢 |
| LIST / MLSD | cmd_LIST / cmd_MLSD | 目錄列表(長格式 / 機器可讀格式) |
| RETR / STOR / APPE | cmd_RETR / cmd_STOR / cmd_APPE | 下載 / 上傳 / 追加,支援 REST 斷點續傳 |
| RNFR / RNTO | cmd_RNFR / cmd_RNTO | 重命名/移動文件或目錄 |
| DELE / MKD / RMD | cmd_DELE / cmd_MKD / cmd_RMD | 刪除文件 / 創建目錄 / 刪除目錄 |
| PASV / PORT | cmd_PASV / (註釋) | 被動模式(主動模式已註釋) |
| AUTH / PBSZ / PROT | cmd_AUTH / cmd_PBSZ / cmd_PROT | FTPS 協商加密 |
| FEAT / OPTS / MDTM / SIZE | cmd_FEAT / cmd_OPTS / cmd_MDTM / cmd_SIZE | 特性列表、選項、文件時間、大小 |
| HASH / REST | cmd_HASH / cmd_REST | 文件 SHA512 雜湊、設置斷點偏移 |
| SITE CHMOD | cmd_SITE | 修改文件權限 |
| CONSOLE | cmd_CONSOLE | 管理控制台指令(用戶/組增刪改查、磁盤空間) |
getPasvPort():從配置範圍隨機選取可用端口,併發安全pushPasvPort()/popPasvPort():共享內存記錄端口佔用,避免衝突stream_socket_server('ssl://...') 配合 stream_context_create 載入證書僅 admin 組用戶可用,格式:COMMAND||JSON_PARAMS
USER-ADD||{"user":"test","pass":"123456","home":"/home/ftp/","expired":"2025-12-31","active":true,"group":"users"}
GROUP-SET-PROFILE||{"group":"users","profile":{"folder":[{"path":"/home/ftp/data/","access":"RWANDLCNDI"}]}}
DISK-FREE||{"path":"/home/ftp"}
logrotate 定期清理。php server.php start|stop|reload 控制;reload 發送 SIGUSR1 平滑重啟 Worker。swoole >= 1.7.20、posix、shmop、openssl。本文詳細拆解了基於 Swoole 的 FTP 服務器四大核心類,涵蓋用戶權限體系、共享內存協作、內嵌 HTTP 管理、完整協議實現。該架構具備高併發、精細權限、FTPS 加密、Web 管理等企業級特性,可作為生產環境文件傳輸服務的基礎框架。後續可擴展:分佈式存儲適配、WebDAV 支援、審計日誌對接 SIEM 等。