使用 LDAP 和 PHP 获取 AD 错误数(ldap 函数返回不精确的错误)

Posted

技术标签:

【中文标题】使用 LDAP 和 PHP 获取 AD 错误数(ldap 函数返回不精确的错误)【英文标题】:Get number of AD errors with LDAP and PHP (ldap function return unprecise error) 【发布时间】:2015-04-30 03:58:21 【问题描述】:

我正在制作一个应用程序,使用 php 连接到 Active Directory (AD),使用 LDAP 协议。

工作正常,我的问题是如果登录操作失败,如何捕获特定错误。今天,应用程序只显示登录是否成功,例如:假设用户名在AD中过期,系统将显示“用户名/密码无效”,因为我们不验证LDAP的具体返回。

好的,让我们来看看问题本身,下面是我希望捕获特定错误的代码。

<?php
if (! ($bind = @ldap_bind ( $connect, "DOMAIN\\" . strtoupper ( $this->user), $this->password))) 
            error_log ( "Autentication fails LDAP (user: $this->user)" );

            return ldap_errno ( $connect );
?>

那个函数,ldap_errno,根据这张表返回给我发生的事情的数量:

(还有更多,见下方链接)

48 LDAP_INAPPROPRIATE_AUTH 49 LDAP_INVALID_CREDENTIALS 49 / 52e AD_INVALID 凭据 49 / 525 用户未找到 49 / 530 NOT_PERMITTED_TO_LOGON_AT_THIS_TIME 49 / 531 RESTRICTED_TO_SPECIFIC_MACHINES 49 / 532 密码过期 49 / 533 ACCOUNT_DISABLED 49 / 568 ERROR_TOO_MANY_CONTEXT_IDS 49 / 701 ACCOUNT_EXPIRED 49 / 773 用户必须重置密码 50 LDAP_INSUFFICIENT_ACCESS

http://wiki.servicenow.com/index.php?title=LDAP_Error_Codes

好的,问题是 PHP 总是只返回 49 (LDAP_INVALID_CREDENTIALS),与情况无关(与登录有关的情况)。例如,如果我的帐户已过期,PHP 返回我 49,我想要返回 49 / 701,我如何才能找到 701?是另一个功能吗?

如果他的密码或他的用户名无效,我如何向用户显示,而不是两者?我知道显示两者都无效是一个安全点,但我们决定最好显示什么是错误的,如果用户名或密码,是否可以通过 LDAP 知道?

PHP 版本 5.4.31

编辑

我发现了一个有用的问题:

https://bugs.php.net/bug.php?id=47222

任何人都知道如何以这种方式进行 ldap_search:

ldapsearch -x -H ldap://der-ad-server.de:389 -D accountname@der-ad-server.de -W 

我不知道如何使用 PHP ldap_search() 函数进行此搜索

【问题讨论】:

您不会向用户显示用户名或密码是否错误!如果您这样做,攻击者可以轻松地检查用户名,然后使用暴力攻击检查密码。只要你只说“用户名和密码之一是错误的”,你就不能说是哪个。因此破解系统要困难得多。 好的,我知道了。但是,有没有办法做到这一点? 我还找到了下面提到的解决方案并将其包装在一个不错的功能中。见这里:***.com/a/37188629/1059828 @abimelex 嘿,很好!如果标题与 ldap 诊断错误更相关,那就太好了:)。 【参考方案1】:

花了很多时间搜索后,我找到了解决方案!

我已在此页面创建: http://php.net/manual/en/function.ldap-get-option.php

基本上你必须定义一个名为LDAP_OPT_DIAGNOSTIC_MESSAGE的新常量变量

喜欢这个

define('LDAP_OPT_DIAGNOSTIC_MESSAGE', 0x0032);

然后

ldap_get_option($conn, LDAP_OPT_DIAGNOSTIC_MESSAGE, $extended_error);

这样,LDAP 会给您扩展错误,您将能够知道实际发生了什么,该值将放入 $extended_error。

【讨论】:

以上是关于使用 LDAP 和 PHP 获取 AD 错误数(ldap 函数返回不精确的错误)的主要内容,如果未能解决你的问题,请参考以下文章

LDAP方式连接AD获取用户信息

ldap简单的性能测试

如何通过Java中的LDAP获取AD组的所有成员

Spring LDAP 无法从 AD LDS 读取

JAVA使用Ldap操作AD域

尝试进行用户名查找时收到特定的AD ldap错误