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

PHP 實作 FTP 使用者線上管理:系統帳號建立、Shell 限制、目錄權限自動化

     編輯:PHP 綜合知識

系統架構

Web 表單收集帳號密碼 → PHP 呼叫系統指令建立 FreeBSD 系統使用者(等同 FTP 帳號) → 設定專用 Shell 禁止 Telnet/SSH → 建立家目錄與 public_html → 設定擁有者權限。

關鍵系統指令

# 建立 ftpuser 群組(一次性)
pw groupadd ftpuser

# 建立限制 Shell(/bin/ftponly)
#!/bin/csh
cat << 'EOF'
You can only use this username to login FTP server!
And you can not use it to telnet to this system!
EOF
sleep 10
exit
# chmod +x /bin/ftponly
# 將 /bin/ftponly 加入 /etc/shells

PHP 核心程式碼

<?php
if (isset($_POST['username'], $_POST['userpasswd'])) {
    $username = escapeshellarg($_POST['username']);
    $password = escapeshellarg($_POST['userpasswd']);
    $rootPwd  = 'your_root_password'; // 建議用 SSH Key 或 sudoers 免密執行特定指令

    // 1. 建立系統使用者(需 root 權限)
    $cmd = "echo $password | pw useradd $username -s /bin/ftponly -g ftpuser -h 0";
    exec("su root -c $cmd", $out, $ret);
    if ($ret !== 0) die("建立使用者失敗: " . implode("\n", $out));

    // 2. 建立家目錄
    foreach (['', '/public_html'] as $sub) {
        $dir = "/home/$username$sub";
        exec("su root -c 'mkdir -p " . escapeshellarg($dir) . "'", $out, $ret);
        if ($ret !== 0) die("建立目錄 $dir 失敗");
        // 設定擁有者
        exec("su root -c 'chown " . escapeshellarg($username) . " " . escapeshellarg($dir) . "'", $out, $ret);
        if ($ret !== 0) die("chown $dir 失敗");
    }

    echo "恭喜 $username,FTP 帳號建立成功!請使用 FTP 客戶端登入(無 Telnet 權限)。";
    exit;
}
?>

安全強化重點

  1. 輸入過濾:escapeshellarg() 防指令注入,帳號密碼僅允許字母數字底線。
  2. 最小權限:Web 使用者(www)加入 wheel 群組,配置 sudoers 僅允許執行特定 pw useradd/mkdir/chown 指令,免輸入 root 密碼。
  3. 密碼不落地:避免在程式碼寫死 root 密碼,改用 ssh root@localhost "cmd" 金鑰認證,或 sudo -u root。
  4. Shell 限制:/bin/ftponly 只顯示警告訊息並睡眠 10 秒退出,有效阻擋 Telnet/SSH 互動登入。
  5. 目錄權限:家目錄 755、public_html 755,FTP 根目錄限制在 public_html(vsftpd local_root=public_html)。
  6. 日誌審計:記錄建立時間、IP、操作者、帳號名,定期審核。

現代替代方案

  • 虛擬使用者:vsftpd/ProFTPD 支援虛擬使用者(資料庫驗證),無需建立系統帳號,安全性更高、管理更靈活。
  • LDAP/AD 整合:企業環境統一身分認證。
  • 容器化:FTP 服務跑在容器,使用者映射為容器內 UID/GID,主機完全隔離。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved