从PHP

时间:2018-10-03 21:44:23

标签: php bash

我正在尝试从PHP后端验证VMailMgr用户的密码。当我从bash中使用checkvpw时,我的行为(几乎)得到了,我期望:

$ printf "%s\0%s\0%s\0" email@address.com correctPassword Y2018 | checkvpw ls . 3<&0
cur new tmp
$ echo $?
0

$ printf "%s\0%s\0%s\0" email@address.com wrongPassword Y2018 | checkvpw ls . 3<&0
$ echo $?
1

我实际上希望ls列出当前工作目录的内容,但会列出用户的maildir的内容。同样,如果我使用echo hi而不是ls .,它将输出用户maildir的路径而不是hi。但是,我可以依靠checkvpw的退出状态。

当我对以下PHP代码段进行相同的操作时,我将获得退出状态111,以获取正确的密码。

<?php
$proc = proc_open('checkvpw ls .', [
    0 => ['pipe', 'r'],
    1 => ['pipe', 'w'],
    2 => ['pipe', 'w'],
    3 => ['pipe', 'r']
], $pipes, null, [
    'TCPLOCALHOST' => 'address.com'
]);
fprintf($pipes[3], "%s\0%s\0%s\0", "email@address.com", "correctPassword", "Y2018");
echo proc_close($proc);

111表示暂时失败。当我使用错误的密码时,我仍然会获得退出代码1

请注意,手册页指出checkvpw要求将环境变量TCPLOCALHOST设置为要验证的域。但是,如果我省略环境变量,则行为不会改变(只要我提供@address.com,这是有道理的。)

bash中,我尝试使用true代替ls .echo hi。这样,我得到了与PHP相同的行为(正确密码暂时失败):

$ printf "%s\0%s\0%s\0" email@address.com correctPassword Y2018 | checkvpw true 3<&0
$ echo $?
111

$ printf "%s\0%s\0%s\0" email@address.com wrongPassword Y2018 | checkvpw true 3<&0
$ echo $?
1

那么,这两种情况下的临时性故障来自何处? proc_open中的环境与bash中的环境有何不同,使得checkvpw仍然标识错误的密码,但无法验证正确的密码?

还是有更深层的问题(例如我不能使用true)?我怎么知道?

奖金:为什么ls .列出用户的maildir而不是当前工作目录?根据手册页,checkvpw仅应将参数中的""maildir""替换为用户maildir的路径。

我使用的是CentOS 6.10,VMailMgr版本0.97。

0 个答案:

没有答案