首页 文章

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

提问于
浏览
5

我在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 回答

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

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

  • 2

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

    • null DN,空密码(匿名):不进行身份验证,因此此会话和授权状态不安全

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

    • DN和密码:进行身份验证,成功或失败

    • null DN,密码:不进行身份验证,因此此会话和授权状态不安全

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

    另见

  • 7

    在您唠叨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

相关问题