6

我的 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)
  • 不正确的用户名/密码(两个字段都给出)= 未通过身份验证
  • 正确的用户名/密码(两个字段均已给出)= 已通过身份验证

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

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

4

3 回答 3

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"]);
}

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

于 2012-12-12T12:14:32.557 回答
7

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

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

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

也可以看看

于 2012-12-12T11:49:37.067 回答
2

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

$ldapbind = ldap_bind($ldapconn, $ldaprdn, $_POST["密码"]);

是正确的,你可能已经检查过了,但是做一个

var_dump($ldaprdn); var_dump($_POST["密码"]);

看看数据是否准确。

手动放置数据,例如

$ldapbind = ldap_bind($ldapconn, "用户名", "密码");

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

此外,有时您必须给出诸如“用户名”之类的名称,而不是“user.name”,因为这可能是它的存储方式。

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

于 2012-12-12T11:26:39.127 回答