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

PHP 驗證 Linux 系統用戶密碼 (讀取 /etc/passwd) 實現

     編輯:PHP 相關知識

功能場景

在某些系統集成場景下 (如 Web 管理面板、單點登錄代理),需要驗證 Linux 系統賬號密碼。verifypasswd() 函數通過讀取 /etc/passwd (或 /etc/shadow) 中的加密哈希,使用相同鹽值加密用戶輸入密碼進行比對。

核心代碼

<?php
function verifypasswd($USERNAME, $PASSWORD) {
    $fd = fopen("/etc/passwd", "r");
    $contents = fread($fd, filesize("/etc/passwd"));
    fclose($fd);
    if (!$contents) return -2; // 文件讀取錯誤

    $lines = explode("\n", $contents); // 修正:原代碼 split("n") 有誤
    $passwd = array();

    foreach ($lines as $line) {
        list($user, $pass) = explode(":", $line, 2); // 僅分割第一個冒號
        if ($user == $USERNAME) {
            break;
        }
    }

    if (!$user) return 0; // 用戶不存在

    // 經典 DES crypt 格式:前2字符為鹽值
    $cryptedpass = $pass;
    $salt = substr($cryptedpass, 0, 2);
    $Pass = crypt($PASSWORD, $salt);

    return ($Pass == $cryptedpass) ? 1 : -1; // 1: 正確, -1: 錯誤
}
?>

關鍵技術點

  • 權限要求:PHP 進程需有讀取 /etc/passwd (世界可讀) 或 /etc/shadow (僅 root 可讀) 權限。Web 服務器通常以 www-data/apache 運行,**無法直接讀取 shadow 文件**。
  • 哈希算法演進:現代 Linux 使用 SHA-256/512 (以 $5$/$6$ 開頭)、yescrypt 等,crypt() 支持這些格式,但鹽值提取邏輯需相應調整 (非固定 2 字符)。
  • 安全風險:將系統賬號密碼驗證暴露於 Web 介面,極易遭受暴力破解、枚舉攻擊。生產環境極不推薦。

現代最佳實踐

  1. PAM 認證:使用 pam_auth 模塊或 PHP pam 擴展,通過系統 PAM 堆疊驗證,無需讀取密碼文件。
  2. LDAP/SSO:集中身份管理,Web 應用對接 LDAP 或 OAuth/OIDC。
  3. 獨立賬號體系:Web 應用維護自己的用戶表,密碼使用 password_hash() (bcrypt/argon2) 存儲,與系統賬號解耦。

代碼修正提示:原代碼 split("n") 應為 explode("\n") 或 preg_split("/\r?\n/");split(":", ...) 應限制分割次數防止字段值含冒號報錯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved