好的,所以我正在为新网站开发一个小的临时欢迎登陆页面。公众访客可以选择提交他们的电子邮件地址。但我还想为开发人员添加用户/通行证登录,以便在当前的开发阶段查看完整的站点。开发人员在本地LAMP系统上都有用户/传递。
目前,我想识别开发人员而不在适当的网站用户系统上创建两个独立的用户系统,就是要快速检查该用户是否可以使用本地系统登录。 if(pam_auth($ _ POST [“u”],$ _POST [“p”]))就是这么做的。简单,好看。
但后来我发现你需要允许apache用户访问* / security / pam_passwd文件(或稍微更好:pam_tally *)。这样做会造成安全漏洞。
我想知道其他开发人员在验证用户方面做了什么,并从PHP(+ apache)传递了本地LAMP安全系统?这是唯一的方式,还是有替代方案?是否有更好的建议?
最佳答案不一定是代码,而是更多的库名称建议或其他解决方案描述的链接。
答案 0 :(得分:1)
我发现有人使用libpam API放在一起。
c实施
C实现的摘录--pam.c
#include <security/pam_appl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct pam_response *reply;
int null_conv(int num_msg, const struct pam_message **msg, struct pam_response **resp, void *appdata_ptr) {
*resp = reply;
return PAM_SUCCESS;
}
static struct pam_conv conv = { null_conv, NULL };
int main(int argc, char *argv[]) {
int retval;
char *user, *pass;
if(argc == 3) {
user = argv[1];
pass = strdup(argv[2]);
} else {
fprintf(stderr, "Usage: login [username] [password]\n");
exit(1);
}
return authenticate("system-auth", user, pass);
}
int authenticate(char *service, char *user, char *pass) {
pam_handle_t *pamh = NULL;
int retval = pam_start(service, user, &conv, &pamh);
if (retval == PAM_SUCCESS) {
reply = (struct pam_response *)malloc(sizeof(struct pam_response));
reply[0].resp = pass;
reply[0].resp_retcode = 0;
retval = pam_authenticate(pamh, 0);
if (retval == PAM_SUCCESS)
fprintf(stdout, "Authenticated\n");
else
fprintf(stdout, "Not Authenticated\n");
pam_end(pamh, PAM_SUCCESS);
return ( retval == PAM_SUCCESS ? 0:1 );
}
return ( retval == PAM_SUCCESS ? 0:1 );
编译它的命令
$ gcc -g -lpam -o chkpasswd pam.c
示例运行
$ ./chkpasswd myusername mypassword
我认为通过一点点努力,这种方法可以在PHP中适应您的需求。
PHP implmentation
作为这种方法的另一种替代方法,您可以在PHP中推出自己的方法。我在PECL网站上找到了这个PAM库,看起来就像你想要的那样。
我还要看看Moodle项目是如何做到的。这里讨论了它。
应该可以很好地访问库,以便进行必要的调用以通过网络访问类似LDAP的内容来为您进行身份验证。也可以在与Horde安装相同的系统上设置LDAP服务器,配置它以供Horde使用。
这可以让您访问底层系统的身份验证,可能是通过将其“包装”在LDAP服务中以供您的PHP调用使用。