带有TLS的PHP用于安全LDAP

我正在尝试使用远程LDAP服务器。 出于安全考虑,我试图仅使用安全连接。 我能够得到一些代码但我不确定,如果启动TLS本身的PHP文档,如果以下代码仅适用于安全通道。 任何人都可以帮忙吗?</ p>

  $ is_valid_user = FALSE; 

try {
$ ds = ldap_connect('ldap.foo.com',389); \ n if(!ldap_set_option($ ds,LDAP_OPT_REFERRALS,0)){
return“”;
}

if(!ldap_start_tls($ ds)){
return“”;
}
} catch(异常$ e){
返回“”;
}

if(!ldap_set_option($ ds,LDAP_OPT_PROTOCOL_VERSION,3)){
$ error =“LDAP服务器协议错误。”;
返回“ “;
}

try {
$ bnd = @ldap_bind($ ds,'uid ='。$ user。',ou = people,dc = ldap,dc = foo,dc = com',$ passwd );

if($ bnd){
$ is_valid_user = TRUE;

$ srch = ldap_search($ ds,'dc = ldap,dc = foo,dc = com',“uid = $ user “);
$ info = ldap_get_entries($ ds,$ srch);
$ userdn = $ info [0] [”dn“];
$ usernm = $ info [0] [”cn“] [0 ];

返回$ usernm;
} else {
return“”;
}
} catch(Exception $ e){
return“”;
}
</ code> < / pre>
</ div>

展开原文

原文

I am trying to use remote LDAP server. For the purpose of security, I am trying to use only secure connection. I am able to get some code working but I am not sure, given the PHP documentation of start TLS itself, that if the following code works only on secure channel. Can anyone help with this please?

$is_valid_user = FALSE;

try {
    $ds = ldap_connect('ldap.foo.com', 389);
    if (! ldap_set_option($ds, LDAP_OPT_REFERRALS, 0)) {
        return "";
    }

    if (! ldap_start_tls($ds)) {
        return "";
    }
} catch(Exception $e) {
    return "";
}

if (! ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3)) {
    $error = "LDAP Server protocol error.";
    return "";
}

try {
    $bnd = @ldap_bind($ds, 'uid='.$user.', ou=people, dc=ldap, dc=foo, dc=com' , $passwd);

    if ($bnd) {
        $is_valid_user = TRUE;

        $srch=ldap_search($ds, 'dc=ldap, dc=foo, dc=com', "uid=$user");
        $info=ldap_get_entries($ds, $srch);
        $userdn=$info[0]["dn"];
        $usernm=$info[0]["cn"][0];

        return $usernm;
    } else {
        return "";
    }
} catch(Exception $e) {
    return "";
}

1个回答



下面是一些一般性的改进。 是的,除非通过TLS加密连接,否则它的编写方式将无法继续。 LDAP模块此刻不会抛出任何异常,因此不需要try / catch块。 很难说没有看到你的其余代码,但有没有理由要返回一个空字符串而不是 false </ code>或 null </ code>或某种错误信息?< / p>

  $ is_valid_user = false; 

$ ds = ldap_connect('ldap.foo.com',389);
ldap_set_option($ ds,LDAP_OPT_REFERRALS,0); \ nldap_set_option($ ds,LDAP_OPT_PROTOCOL_VERSION,3);

if(!@ldap_start_tls($ ds)){
return“”;
}

$ bindUser ='uid ='。ldap_escape($ user, null,LDAP_ESCAPE_DN)。',ou = people,dc = ldap,dc = foo,dc = com';
if(@ldap_bind($ ds,$ bindUser,$ passwd)){
$ is_valid_user = true;

$ srch = ldap_search($ ds,$ bindUser,'(objectClass = *)',['cn']);
$ info = ldap_get_entries($ ds,$ srch);
$ userdn = $ info [ 0] [“dn”];
$ usernm = $ info [0] [“cn”] [0];

返回$ usernm;
}其他{
返回“”;
} \ n </ code> </ pre>

还有几个可用的LDAP库可以使PHP更容易使用LDAP。 我建议 LdapTools adldap2 。</ p>
</ div>

展开原文

原文

Just a few general improvements below. And yes, how that's written it will not continue unless the connection is encrypted via TLS. The LDAP module doesn't throw any exceptions at the moment, so the try/catch block is not really needed. Hard to tell without seeing the rest of your code, but is there a reason you want to return an empty string instead of false or null or some sort of error message?

$is_valid_user = false;

$ds = ldap_connect('ldap.foo.com', 389);
ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);

if (!@ldap_start_tls($ds)) {
    return "";
}

$bindUser = 'uid='.ldap_escape($user, null, LDAP_ESCAPE_DN).',ou=people,dc=ldap,dc=foo,dc=com';
if (@ldap_bind($ds, $bindUser , $passwd)) {
    $is_valid_user = true;

    $srch = ldap_search($ds, $bindUser, '(objectClass=*)', ['cn']);
    $info = ldap_get_entries($ds, $srch);
    $userdn = $info[0]["dn"];
    $usernm = $info[0]["cn"][0];

    return $usernm;
} else {
    return "";
}

There are also several LDAP libraries available that make LDAP much easier with PHP. I would recommend LdapTools or adldap2.

dragonfly9527
dragonfly9527 非常感谢。 返回空字符串的原因是这些行是函数的一部分,用于从函数中获取信息。 我也可以使用返回FALSE,可能应该有。 但是认为这种返回类型更加一致,在PHP中是一个毫无意义的参数。 从其他工具开始,我只需要进行身份验证并获取名称即可。
大约 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问