使用 exec() 从 PHP 调用密码检查命令 - 如何转义用户输入?

使用 exec() 从 PHP 调用密码检查命令 - 如何转义用户输入?

我正在开发一个基于 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;
    }

}

这是我的主要问题:

  1. 是否可以修改 C 脚本或调用它的 PHP 代码,以便系统正确处理带有特殊字符的密码?
  2. 此设置的总体安全性如何?是否有任何我应该了解的明显漏洞?

相关内容