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

Jor*_*ath 6 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");
}
Run Code Online (Sandbox Code Playgroud)

这是我得到的不同行为:

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

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

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

Jor*_*ath 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"]);
}
Run Code Online (Sandbox Code Playgroud)

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


Ter*_*ner 7

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

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

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

也可以看看

  • 链接已失效。 (2认同)