PHP中的LDAP身份验证 - 无需密码即可进行身份验证

时间:2012-12-12 11:05:00

标签: php ldap

我在LDAP身份验证中遇到了一个奇怪的行为,我需要这个用他们的AD凭据来验证用户,这就是我所拥有的:

session_start(); 
$adServer = "MY IP"; 
$ldapconn = ldap_connect($adServer) or $this->msg = "Could not connect to LDAP server.";

$ldaprdn = "DOMAIN\\" . $_POST["username"];
$ldapbind = ldap_bind($ldapconn, $ldaprdn, $_POST["password"]);

if ($ldapbind) {
//$msg = "Successfully Authenticated";
    $_SESSION['loggedin'] = 1;
    $_SESSION['username'] = $username;
    header("Location: ../main.php");
} else {
    header("Location: ../index.php?login_failed=1");
}

这是我得到的不同行为:

  • 无用户名/无密码=已通过身份验证(BAD)
  • 用户名/无密码=已验证(BAD)
  • 用户名/密码不正确(两个字段都已给出)=未经过身份验证
  • 更正用户名/密码(已给出两个字段)=已验证

我发现这很难集中,如果没有使用密码字段,所有用户都会被验证。但是,如果我使用密码字段,它只会使用正确的凭据对用户进行身份验证..

我在这里做错了什么,还是应该开始唠叨IT人员?

3 个答案:

答案 0 :(得分:8)

在做了一些研究后,我得出结论,我们使用的LDAP服务器允许匿名绑定。

更多信息: https://issues.jfrog.org/jira/browse/RTFACT-3378

  

警告:尝试使用空密码绑定总是成功   因为LDAP协议认为这是一个“匿名”绑定,   即使指定了用户名。始终检查空白密码   在绑定之前。

为了解决这个问题,我现在检查PHP中的密码输入字段:

if (strlen(trim($user_pass)) == 0) {
    //login failed
} else {
    $ldaprdn = "DOMAIN\\" . $_POST["username"];
    $ldapbind = ldap_bind($ldapconn, $ldaprdn, $_POST["password"]);
}

空密码输入(或空格)将始终返回登录失败。

答案 1 :(得分:7)

使用'简单'BIND身份验证方法,有四种可能性:

  • null DN,null password(匿名):不进行身份验证,因此此会话和授权状态不安全
  • DN,空密码(未经身份验证):未进行身份验证,因此此会话和授权状态不安全
  • DN和密码:身份验证发生,成功或失败
  • null DN,密码:不进行身份验证,因此此会话和授权状态不安全

3d是唯一进行身份验证的人。正确配置的LDAP目录服务器将拒绝其他3种可能性,因为与问题所述相反,不会进行身份验证。 API不抛出异常或返回true的方法并不表示是否进行了身份验证。 BIND结果包含一个整数结果代码,表示身份验证是否成功。

另见

答案 2 :(得分:2)

在唠叨IT人员之前,请检查行中是否传递了值

  

$ ldapbind = ldap_bind($ ldapconn,$ ldaprdn,$ _POST [“password”]);

是的,你可能已经检查了这个,但是做了

  

的var_dump($ ldaprdn);   的var_dump($ _ POST [ “密码”]);

并查看数据是否准确。

手动输入数据

  

$ ldapbind = ldap_bind($ ldapconn,“username”,“password”);

同时检查您是否必须提供整个DN,例如CN = Username,DC = xxx,DC = com作为用户名。

有时你必须提供诸如“用户名”之类的名称,而不是“user.name”,因为这是它的存储方式。

如果这一切都失败了,你可以去吃IT人员的负责人:-P