Signatur
Beschreibung
ldap_compare prüft, ob der Wert des angegebenen Attributs $attribute im LDAP-Eintrag mit dem Distinguished Name $dn exakt mit dem Vergleichswert $value übereinstimmt. Die Funktion ist besonders nützlich, wenn sensible Attributwerte wie Passwörter serverseitig verglichen werden sollen, ohne den eigentlichen Attributwert über das Netzwerk lesen zu müssen.
Die Funktion gibt true zurück, wenn der Wert übereinstimmt, und false, wenn er nicht übereinstimmt. Im Fehlerfall (z. B. ungültige Verbindung, nicht vorhandener Eintrag oder Attribut) wird -1 zurückgegeben. Es ist daher wichtig, den Rückgabewert mit dem strikten Vergleichsoperator === zu prüfen, um true, false und -1 korrekt zu unterscheiden.
Ein typischer Anwendungsfall ist die Authentifizierung von Benutzern über LDAP, bei der das eingegebene Passwort mit dem gespeicherten userPassword-Attribut verglichen wird. Da der eigentliche Passwort-Hash dabei nicht übertragen wird, ist diese Methode sicherer als das Auslesen und manuelle Vergleichen des Attributwerts.
Die Funktion erfordert eine aktive und authentifizierte LDAP-Verbindung (erstellt mit ldap_connect und ldap_bind), die über ausreichende Rechte zum Ausführen eines Compare-Vorgangs auf dem Zielattribut verfügt.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $ldap Pflicht | LDAP\Connection | Eine gültige LDAP-Verbindungsressource, wie sie von ldap_connect zurückgegeben wird. Ab PHP 8.1 ist dies ein LDAP\Connection-Objekt. |
|
| $dn Pflicht | string | Der Distinguished Name (DN) des LDAP-Eintrags, in dem das Attribut verglichen werden soll, z. B. uid=jdoe,ou=users,dc=example,dc=com. |
|
| $attribute Pflicht | string | Der Name des LDAP-Attributs, dessen Wert verglichen werden soll, z. B. userPassword oder mail. |
|
| $value Pflicht | string | Der Wert, mit dem das Attribut des LDAP-Eintrags verglichen werden soll. Der Vergleich ist exakt und abhängig von der LDAP-Serverkonfiguration (z. B. Groß-/Kleinschreibung). |
Rückgabewert
true zurück, wenn der Attributwert mit $value übereinstimmt, false wenn nicht, und -1 im Fehlerfall (z. B. wenn der Eintrag oder das Attribut nicht existiert oder ein LDAP-Fehler aufgetreten ist). Unbedingt === für den Vergleich verwenden, da -1 ansonsten als true ausgewertet werden kann.Beispiele
Passwortvergleich über LDAP
<?php
$ldap = ldap_connect('ldap://ldap.example.com');
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
// Anmeldung mit einem Benutzer, der Lesezugriff hat
ldap_bind($ldap, 'cn=readonly,dc=example,dc=com', 'geheimesPasswort');
$dn = 'uid=jdoe,ou=users,dc=example,dc=com';
$eingabe = 'meinPasswort123';
$ergebnis = ldap_compare($ldap, $dn, 'userPassword', $eingabe);
if ($ergebnis === true) {
echo 'Passwort korrekt – Authentifizierung erfolgreich.';
} elseif ($ergebnis === false) {
echo 'Passwort falsch – Authentifizierung fehlgeschlagen.';
} else {
// $ergebnis === -1
echo 'Fehler beim LDAP-Vergleich: ' . ldap_error($ldap);
}
ldap_unbind($ldap);
?>
Attributwert eines Eintrags prüfen
<?php
$ldap = ldap_connect('ldap://ldap.example.com');
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_bind($ldap, 'cn=admin,dc=example,dc=com', 'adminPasswort');
$dn = 'uid=jdoe,ou=users,dc=example,dc=com';
$erwarteteEmail = 'jdoe@example.com';
$ergebnis = ldap_compare($ldap, $dn, 'mail', $erwarteteEmail);
if ($ergebnis === true) {
echo 'E-Mail-Adresse stimmt überein.';
} elseif ($ergebnis === false) {
echo 'E-Mail-Adresse stimmt NICHT überein.';
} else {
echo 'Fehler: ' . ldap_error($ldap);
}
ldap_unbind($ldap);
?>
// Wichtig · Fallstricke
Achtung beim Vergleichsoperator: Da ldap_compare sowohl true, false als auch -1 zurückgeben kann, muss zwingend der strikte Vergleich === (anstelle von ==) verwendet werden. Andernfalls wird -1 (Fehlerfall) in einem booleschen Kontext als true interpretiert, was zu schwerwiegenden Sicherheitslücken führen kann – z. B. wird ein Benutzer fälschlicherweise als authentifiziert betrachtet, obwohl der Eintrag gar nicht existiert.
Serverseitige Verarbeitung: Der eigentliche Attributwert wird bei ldap_compare nicht vom Server übertragen, da der Vergleich serverseitig stattfindet. Dies ist sicherer als das Auslesen des Attributs mit ldap_read und anschließendem manuellen Vergleich.
Rechte: Der für ldap_bind verwendete Benutzer muss auf dem LDAP-Server das Recht haben, einen Compare-Vorgang auf dem gewünschten Attribut auszuführen. Manche Attribute wie userPassword erfordern spezielle ACL-Konfigurationen.
Ab PHP 8.1 wurde die Ressource durch das Objekt LDAP\Connection ersetzt. Älterer Code, der mit resource arbeitet, erzeugt in PHP 8.1+ Deprecation-Warnungen.