我有一个“简单”的问题:如何在 PHP 脚本中安全地更改用户密码,而不授予 Apache root 权限或引入其他疯狂的安全漏洞?
背景:CentOS 6、Apache 2.2.13、PHP 5.3.3
我知道 pam_chpasswd() 命令,它是 PECL PAM 库的一部分。但是,除非主机进程 (httpd) 具有对 /etc/shadow 文件的读取权限,否则此功能会失败。(坏主意!如果它需要如此高的权限,不知道这个库有什么帮助......)
就我所见,理想的情况是让 PHP 使用 'sudo -u[username of user changed his password]' 调用 shell 脚本,这将运行脚本“AS”用户,所以他应该有权更改自己的密码。并且 sudo 将要求用户发送他现有的密码以便进行身份验证,从而防止一个用户更改另一个用户的密码。
但这由于某种原因不起作用......当使用 popen 打开进程时,该进程永远不会执行。我设置了 shell 脚本以将一些文本转储到 /tmp 中的一个可公开写入的文件中。但它永远不会到那个地步。
$cmd = "/usr/bin/sudo -S -u$username /file_to_execute.sh";
$handle = popen ($cmd, "w"); // Open the process for writing
fwrite ($handle, "$current_password\n"); // Send the user's current password to sudo (-S option)
fwrite .... (write the username, current password, and new password, so the script can change it)
$result = pclose($handle);
如果我访问这个 php 脚本(http://server/script.php),该函数立即失败,并且 $result = 1
如果我修改 sudoers 文件 (visudo) 并添加一行:
$
Defaults:apache !requiretty
脚本冻结大约 10 秒,然后失败 ($result = 1)
任何这样做的建议都非常感谢!