6

LDAP認証で奇妙な動作が発生しています.AD資格情報でユーザーを認証するためにこれが必要です.これは私が持っているものです:

session_start(); 
$adServer = "MY IP"; 
$ldapconn = ldap_connect($adServer) or $this->msg = "Could not connect to LDAP server.";

$ldaprdn = "DOMAIN\\" . $_POST["username"];
$ldapbind = ldap_bind($ldapconn, $ldaprdn, $_POST["password"]);

if ($ldapbind) {
//$msg = "Successfully Authenticated";
    $_SESSION['loggedin'] = 1;
    $_SESSION['username'] = $username;
    header("Location: ../main.php");
} else {
    header("Location: ../index.php?login_failed=1");
}

これは私が得るさまざまな動作です:

  • ユーザー名なし/パスワードなし = 認証済み (BAD)
  • ユーザー名 / パスワードなし = 認証済み (BAD)
  • ユーザー名/パスワードが正しくない (両方のフィールドが指定されている) = 認証されていない
  • 正しいユーザー名/パスワード (両方のフィールドが指定されている) = 認証済み

パスワードフィールドが使用されていない場合、すべてのユーザーが検証されています。しかし、パスワードフィールドを使用すると、正しい資格情報を持つユーザーのみが認証されます..

ここで何か間違ったことをしているのですか、それとも IT 担当者にしつこく言い始めるべきですか?

4

3 に答える 3

8

いくつかの調査を行った後、私たちが使用している LDAP サーバーは匿名バインドを許可しているという結論に達しました。

詳細はこちら: https://issues.jfrog.org/jira/browse/RTFACT-3378

警告: ユーザー名が指定されていても、LDAP プロトコルはこれを「匿名」バインドと見なすため、空のパスワードでバインドしようとすると常に成功します。バインドする前に、空白のパスワードを常に確認してください。

これを回避するために、PHP のパスワード入力フィールドを確認します。

if (strlen(trim($user_pass)) == 0) {
    //login failed
} else {
    $ldaprdn = "DOMAIN\\" . $_POST["username"];
    $ldapbind = ldap_bind($ldapconn, $ldaprdn, $_POST["password"]);
}

空のパスワード入力 (または空白) は、常にログイン失敗を返します。

于 2012-12-12T12:14:32.557 に答える
7

「単純な」BIND 認証方法を使用すると、次の 4 つの可能性があります。

  • null DN、null パスワード (匿名): 認証が行われないため、このセッションと承認状態は安全ではありません
  • DN、null パスワード (認証なし): 認証が行われないため、このセッションと認証状態は安全ではありません
  • DN とパスワード: 認証が行われ、成功または失敗します。
  • null DN、パスワード: 認証が行われないため、このセッションと認証状態は安全ではありません

認証が行われるのは 3D だけです。適切に構成された LDAP ディレクトリ サーバーは、質問の内容に反して認証が行われないため、他の 3 つの可能性を拒否します。例外をスローしない、または返さない API のメソッドは、true認証が行われたかどうかを示しません。BIND の結果には、認証が成功したかどうかを示す整数の結果コードが含まれています。

こちらもご覧ください

于 2012-12-12T11:49:37.067 に答える
2

IT担当者をしつこくする前に、値が行に渡されたかどうかを確認してください

$ldapbind = ldap_bind($ldapconn, $ldaprdn, $_POST["パスワード"]);

正解です。おそらくこれはすでにチェック済みですが、

var_dump($ldaprdn); var_dump($_POST["パスワード"]);

データが正確かどうかを確認します。

次のようなデータを手動で配置します

$ldapbind = ldap_bind($ldapconn, "ユーザー名", "パスワード");

また、ユーザー名に C​​N=Username,DC=xxx,DC=com など、DN 全体を指定する必要があるかどうかも確認してください。

また、「user.name」ではなく「User Name」などの名前を付けなければならない場合もあります。

これがすべて失敗した場合は、IT 担当者の頭を食べに行くことができます :-P

于 2012-12-12T11:26:39.127 に答える