php LDAP无效凭证

use*_*859 0 php authentication ldap

我的代码是:

$user = 'test';
$password = 'testpass';
$host = '10.1.1.1';
$port = 389;
$basedn = 'dc=ci,dc=mycompany,dc=com';
$group = 'Users';
$ldaprdn = 'uid=test,dc=ci,dc=mycompany,dc=com';

$ad = ldap_connect("ldap://$host", $port);
if ($ad) {
    echo "Connected" . "<br/>";
} else {
    echo ldap_error($ad) . "<br/>";
}
ldap_set_option($ad, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ad, LDAP_OPT_REFERRALS, 0);

//  $ldapBind = ldap_bind($ad, "{$user}@{$domain}", $password); // 1.
//  $ldapBind = ldap_bind($ad, $user, $password); // 2.
    $ldapBind = ldap_bind($ad, $ldaprdn, $password); // 3.
//  $ldapBind = ldap_bind($ad, null, null); // 4.

if ($ldapBind) {
    echo "Binded" . "<br/>";
} else {
    echo ldap_error($ad) . "<br/>";
}
Run Code Online (Sandbox Code Playgroud)

现在,我使用注释行“ 3”,得到:

Connected
Invalid credentials
Run Code Online (Sandbox Code Playgroud)

如果使用注释行“ 1”或“ 2”,请获取:

Connected
Invalid DN syntax
Run Code Online (Sandbox Code Playgroud)

如果使用注释行“ 4”(这是匿名用户),请获取:

Connected
Binded
Run Code Online (Sandbox Code Playgroud)

这是在Ubuntu 12下开发的。

为什么我从注释行“ 3”收到无效的凭证错误?如何正确绑定身份验证?提前致谢!

Ter*_*ner 5

无论文档说什么,该ldap_bind功能似乎都需要DN而不是RDN。如果是这样,则:

  • 数字1. {$user}@{$domain}不是正确格式的DN,因此:Invalid DN syntax
  • 数字2:test格式不正确的DN,因此:Invalid DN syntax

有关DN格式的字符串表示形式的信息,请参阅RFC4514。

用已知的好的工具进行验证

据我所知,数字3是所提供的四个中唯一正确的数字。Directory Server在BIND响应中指示它无法验证提供的密码是否testpass与存储在其数据库中的密码匹配。在这种情况下,建议您使用已知的优质工具来检查密码ldapsearch

ldapsearch -h hostname -p port              \
    -D 'uid=test,dc=ci,dc=mycompany,dc=com' \
    -w 'testpass' -s base '(&)' 1.1
Run Code Online (Sandbox Code Playgroud)

ldapsearch绑定到目录为'UID =测试,DC = CI,DC = myCompany中,DC = com的'使用密码testpass并获取DN中的uid=test条目。如果此操作因“无效的凭据”错误而失败,则存在以下可能性:

  • testpass 不是正确的密码
  • 可以将某些目录服务器配置为将结果代码设置为“无效凭据”,而不管真正的错误是什么。这样做的原因是隐瞒攻击者的信息
  • uid=test条目不存在。上面的要点说明,这将导致“无效的凭据”。告诉攻击者没有条目是没有意义的,这将为攻击者提供其他信息(他要尝试的DN少一些)。

行话和LDAP

为了使用正确的行话:

  • $ldaprdn不是RDN,而是DN。RDN是DN的组成部分

也可以看看