我正在开发一个基于 PHP 的网站,其中登录表单需要通过 PAM 对系统上的本地用户进行身份验证 - 换句话说,如果他们输入本地用户帐户的有效用户名和密码,他们应该能够成功登录服务器。该网站最初使用php-auth-pam模块,但由于它已被弃用,我目前不得不寻找替代解决方案。
我最终遇到了这个答案带有用于针对 PAM 进行身份验证的有用 C 脚本。我成功地将其编译成名为 的可执行文件chkpasswd
,并检查用户名/密码组合,我只需运行:
./chkpasswd username password
如果凭据有效,则输出“已验证”;如果无效,则输出“未验证”。这部分工作起来就像一个魅力,没有任何问题。
但很快我意识到有一个明显的问题 - 当密码包含特殊字符时,此设置无法正常工作!即使凭据正确,它也会说用户未经过身份验证。我正在chkpasswd
使用 PHP 的exec()
函数进行调用,并使用它escapeshellarg()
来转义用户输入。这是 PHP 代码:
function pam_auth2($username, $password){
$result = exec("/usr/local/sbin/chkpasswd ".escapeshellarg($username)." ".escapeshellarg($password));
if ($result == "Authenticated"){
return true;
}
else{
return false;
}
}
这是我的主要问题:
- 是否可以修改 C 脚本或调用它的 PHP 代码,以便系统正确处理带有特殊字符的密码?
- 此设置的总体安全性如何?是否有任何我应该了解的明显漏洞?