2016-07-02 9 views
0

リモートLDAPサーバーを使用しようとしています。セキュリティの目的で、私は安全な接続だけを使用しようとしています。私はいくつかのコードを動作させることができますが、次のコードが安全なチャネルでのみ動作する場合は、TLS自体のPHPドキュメントを参照してください。誰か助けてくれますか?安全な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 ""; 
} 

答えて

1

下記のような一般的な改善がほんの少しです。そして、接続がTLS経由で暗号化されていない限り、それはどのように書かれているのでしょうか? LDAPモジュールは現時点で例外をスローしませんので、try/catchブロックは実際には必要ありません。あなたのコードの残りの部分を見ることなく伝えるのは難しいですが、falseまたはnullや何らかのエラーメッセージの代わりに空の文字列を返す理由がありますか?

$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 ([email protected]_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 ""; 
} 

さらに、PHPを使用してLDAPを簡単にするためのLDAPライブラリがいくつかあります。 LdapToolsまたはadldap2をお勧めします。

+0

ありがとうございました。 null文字列を返す理由は、これらの行が関数から情報を取得するための関数の一部であるためです。私はリターンを使用することもできたかもしれない偽、持っている必要があります。しかし、この戻り値の型は、PHPでは無意味な引数であると考えています。他のツールと同様に、私は認証して名前を取得する必要があります、それだけです。 – user926918

関連する問題