【问题标题】:PHP with TLS for secure LDAP用于安全 LDAP 的带有 TLS 的 PHP
【发布时间】:2016-07-02 11:14:01
【问题描述】:

我正在尝试使用远程 LDAP 服务器。为了安全起见,我尝试仅使用安全连接。我可以让一些代码工作,但我不确定,鉴于启动 TLS 本身的 PHP 文档,如果以下代码仅适用于安全通道。请问有人可以帮忙吗?

$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 "";
}

【问题讨论】:

    标签: php security ssl ldap


    【解决方案1】:

    以下只是一些一般性改进。是的,除非连接通过 TLS 加密,否则它的编写方式将不会继续。 LDAP 模块目前不会抛出任何异常,因此不需要 try/catch 块。如果不查看其余代码,很难判断,但您是否有理由要返回空字符串而不是 falsenull 或某种错误消息?

    $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 "";
    }
    

    还有几个可用的 LDAP 库使 PHP 的 LDAP 变得更加容易。我会推荐LdapToolsadldap2

    【讨论】:

    • 非常感谢。返回空字符串的原因是这些行是从函数中获取信息的函数的一部分。我也可以使用 return FALSE,可能应该有。但是觉得这个返回类型比较一致,在 PHP 中是一个无意义的参数。至于其他工具,我只需要验证并获取名称,仅此而已。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 2014-06-14
    • 2015-11-11
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多