本程式針對 Windows 2000 環境下的 Serv-U FTP 伺服器,透過直接讀寫 ServUDaemon.ini 設定檔實現 Web 介面帳號自動建立功能。雖然作者自稱「很爛、初稿」,但展示了早期系統整合的實用技巧與 Ini 檔案結構操作邏輯。
fopen($path, "r+") 開啟 Ini 檔,fread() 讀取完整內容至字串strpos($str, "=".$userid) 搜尋用戶識別碼User1 區段,統計現有用戶數決定新用戶代號@mkdir($userpath, 0700) 建立 FTP 根目錄fseek(),fputs() 寫入新設定$start1 = strpos($str, "User1");
if ($start1) {
$start = $start1 + 6;
$end = strpos($str, "|", $start);
$firstusername = substr($str, $start, $end - $start);
$start2 = strpos($str, "[USER=".$firstusername."|1]");
$usernum = count(split(" ", substr($str, $start1, $start2 - $start1)));
} else {
$usernum = 1;
}
$userinfo = "User".$usernum."=".$userid."|1|0 ";
透過字串位置運算解析 Ini 結構,計算下一個可用用戶編號,構建 UserN=userid|1|0 格式記錄。
$maxsize = $size * 1024; // MB 轉 KB
$userp = "[USER=".$userid."|1] ";
$userp .= "Password=".$password." ";
$userp .= "HomeDir=".$userpath." ";
$userp .= "RelPaths=1 ";
$userp .= "DiskQuota=1|".$maxsize."|0 ";
$userp .= "MaxUsersLoginPerIP=2 ";
$userp .= "TimeOut=600 ";
$userp .= "Access1=".$userpath."|RWAMLCDP ";
參數含義:
DiskQuota=1|容量|0:啟用磁碟配額,單位 KB,無硬性限制Access1=路徑|RWAMLCDP:完整權限(讀寫刪列建目錄權限)MaxUsersLoginPerIP=2:單 IP 最大並發連線數| 問題 | 風險 | 改善方向 |
|---|---|---|
| 直接操作 Ini 檔 | Serv-U 運行時鎖定檔案導致寫入失敗/資料損毀 | 使用 Serv-U COM API 或資料庫後端 |
| 明文密碼儲存 | 設定檔洩露即帳號被盜 | 啟用 Serv-U 密碼加密選項 |
| 無輸入驗證 | 路徑遍歷、注入攻擊風險 | 嚴格過濾 userid、password、size 參數 |
| 檔案鎖定機制不完整 | 併發申請導致資料競爭 | 引入資料庫交易或檔案獨佔鎖 |
| 硬編碼路徑 (E:\) | 部署環境遷移困難 | 配置檔化路徑設定 |
此程式雖屬歷史產物,但其「解析結構化設定檔 → 計算新記錄 → 定位插入寫入」的核心邏輯,在現代基礎設施即代碼、配置管理工具中仍具通用參考價值。