PHP:身份验证本地unix用户(不能直接访问/etc/shadow)

6tr1vspr  于 2023-02-07  发布在  PHP
关注(0)|答案(4)|浏览(123)

给定用户名和密码,我需要检查本地系统上是否有用户使用该用户名和密码。
我知道posix_getpwnam和使用PAM包,但这两种方法都要求PHP脚本具有对/etc/shadow的访问权限,我不想干扰系统文件或守护进程用户的权限。
我想这可以通过使用标准的系统命令(如sudo)或编写自己的小型setuid C程序来完成。我还可以尝试使用所述用户名/密码通过FTP或SSH连接到localhost以验证它。有更简单的方法吗?

2ul0zpep

2ul0zpep1#

如果你想要一个更本地的方式,你可以自己滚动。我会更多地研究PAMpam_authenticate.
我的意思是,你应该能够创建一个应用程序,验证,但不需要使用PAM的根,例如sudo。
但是,如果您需要更简单的解决方案,只需调用:
来源www.example.comlogin.sh

#!/bin/bash
su $1 < `echo $2` #Need echo for the newline

在PHP代码中,作为login.shexec语句,第一个参数是用户名,第二个参数是密码。

lp0sw83n

lp0sw83n2#

1.我相信ftp/ssh是一种巧妙的方法,假设系统总是运行这些。
1.另一种可能性是写一些脚本从/etc/shadow中提取这些用户,并作为一个cron作业运行这个脚本来定期更新它。这个脚本创建一个文件,权限只针对运行你的网站的用户(apache之类的),如果你真的想疯狂的话,可以检查这个文件甚至数据库的条目到mysql。
第一个简单易行,第二个稍微麻烦一点,另一个刚刚想到的方法是通过php执行一个系统命令,比如useradd $user并检查return,这需要sudo。

huus2vyu

huus2vyu3#

我也可以尝试通过FTP或SSH连接到localhost,并使用所述用户名/密码进行验证。
这就是我最后所做的(使用PHP ssh 2扩展)。本地命令也通过相同的连接运行,在用户的凭据下。

b5buobof

b5buobof4#

如果您的脚本可以运行su(切换用户)命令,就不需要通过网络连接,但是如果用户没有密码,这种方法是危险的,因为密码将作为命令执行。我使用这个检查/etc/group文件之前,它检查用户的登录是否在所需的组。

function unix_auth_local_user($username, $password)
{
    $ok = false;
    $username = escapeshellarg($username);
    $pipes_spec = [
        ["pipe", "r"],
        ['file', '/dev/null', 'a'],
        ['file', '/dev/null', 'a']
    ];
    $command = escapeshellarg("exit;");
    $process = proc_open('su '.$username.' -c '.$command, $pipes_spec, $pipes);
    if (is_resource($process)) {
        fwrite($pipes[0], $password);
        fclose($pipes[0]);
        $status = proc_close($process);
        $ok = $status === 0;
    }
    return $ok;
}

另外,请记住,这会触发用户的登录脚本和注销后脚本(ssh登录也是如此)。

相关问题