1

大企業のイントラネット Web サイトを管理しています。現在のユーザー認証システムに障害が発生したため、緊急の解決策を開発する必要がありました。ここに簡略化されたコードがあります

$usr=$_POST['user'];
$psw=$_POST['code'];

if(!strlen($psw) )
$psw="x";
// because empty password works fine for any user

$ldap= ldap_connect("LDAP://ldapserver.xxx.local");
if(!$ldap)
exit(0);

ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldap, LDAP_OPT_OPT_REFERRALS, 0);

if($bind = @ldap_bind($ldap, $usr, $psw){
header("Location: http:10.xx.xx.xx/entrance.php?id=$usr");
// login OK, look for user privileges
}else{
header("Location: http:10.xx.xx.xx/login.php?INV=1");
// back to login page
}

コードは問題なく動作しますが、ネットワーク ユーザー名とパスワードを入力する必要はありません。ユーザーがこのページにアクセスし、LDAP サーバーに匿名で接続してバインドすると、ページはこのユーザーのユーザー名に関する情報を取得できます。

そして、フルネーム、支店コード、支店、メールアドレスなどの追加情報を提供できれば、それは大きなボーナスになります..

4

1 に答える 1

0

LDAP サーバーによって異なります。認証が必要な場合は、その情報を提供する必要があります。ただし、これは特定のユーザーにバインドするのではなく、特定のサービス アカウントに委任する必要があります (これはまったく別のプロセスです)。とにかく、それが問題ではないと仮定すると、 を使用して LDAP サーバーにクエリを実行できますldap_search

たとえば、 DN のcihats下でのユーザー名を検索する場合は、次のようにします。o=example

$ldap = @ldap_connect($yourHostname);
$query = @ldap_search($ldap, 'o=example', 'cn=cihats');
$results = @ldap_get_entries($ldap, $query);

if ($results['count']) {
  print_r($results);
} else {
  echo "No such common name";
}

の出力はldap_get_entries、検索で見つかった各一致のディレクトリ全体になるため、完全な名前、支店コードなどを取得できますが、これらにはサイト固有のキーがあります.

于 2013-03-19T16:39:32.157 に答える