Start · Sprachen · PHP · Referenz · ldap_set_rebind_proc

ldap_set_rebind_proc

Funktion

Registriert eine Callback-Funktion, die bei der Verfolgung von LDAP-Verweisen (Referrals) für erneute Bindungen (Rebinds) aufgerufen wird.

seit PHP 4.2.0 Kategorie: misc

Signatur

ldap_set_rebind_proc(LDAP\Connection $ldap, callable|null $callback): bool

Beschreibung

ldap_set_rebind_proc ermöglicht es, eine benutzerdefinierte Callback-Funktion zu registrieren, die automatisch aufgerufen wird, wenn der LDAP-Client einem Verweis (Referral) folgt und sich dabei an einem anderen LDAP-Server erneut authentifizieren muss. Ohne eine solche Funktion würden Verweise anonym oder gar nicht verfolgt werden, was in gesicherten Verzeichnisumgebungen zu Fehlern führt.

Der Callback erhält als Parameter die LDAP-Verbindungsressource (bzw. das LDAP\Connection-Objekt ab PHP 8.1), die Ziel-URL des Referrals sowie den Bindetyp (LDAP_BIND_TYPE_SIMPLE oder LDAP_BIND_TYPE_SASL). Innerhalb des Callbacks soll die Bindung an den neuen Server durchgeführt werden, typischerweise mittels ldap_bind.

Um einen bereits registrierten Callback zu entfernen und zur anonymen Verweisverfolgung zurückzukehren, übergibt man null als zweiten Parameter. Die Funktion ist besonders nützlich in Enterprise-Umgebungen mit Active Directory oder OpenLDAP, wo Verzeichnisanfragen zwischen mehreren Servern weitergeleitet werden.

Damit Verweise überhaupt verfolgt werden, muss die LDAP-Option LDAP_OPT_REFERRALS auf 1 gesetzt sein (dies ist oft die Standardeinstellung). Wird die Verfolgung deaktiviert, hat ein registrierter Rebind-Callback keine Auswirkung.

Parameter

Name Typ Default Beschreibung
$ldap Pflicht LDAP\Connection Eine aktive LDAP-Verbindung, die mit ldap_connect erzeugt wurde.
$callback Pflicht callable|null Eine aufrufbare Funktion mit der Signatur callback(LDAP\Connection $ldap, string $referral, int $bindtype): bool. Wird null übergeben, wird der bestehende Callback entfernt und erneute Bindungen werden nicht mehr durchgeführt.

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei Erfolg zurück und false bei einem Fehler, beispielsweise wenn keine gültige LDAP-Verbindung übergeben wurde.

Beispiele

Rebind-Callback für authentifizierte Verweisverfolgung registrieren

<?php
$ldap = ldap_connect('ldap://primary.example.com');
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldap, LDAP_OPT_REFERRALS, 1);

// Zugangsdaten (in der Praxis aus sicherer Konfiguration beziehen)
$bindUser = 'cn=serviceuser,dc=example,dc=com';
$bindPass = 'geheimes_passwort';

// Initiale Bindung
ldap_bind($ldap, $bindUser, $bindPass);

// Rebind-Callback registrieren
ldap_set_rebind_proc($ldap, function (LDAP\Connection $conn, string $referral, int $bindtype): bool {
    global $bindUser, $bindPass;
    // Erneute Authentifizierung am Zielserver des Referrals
    $result = ldap_bind($conn, $bindUser, $bindPass);
    if (!$result) {
        error_log('Rebind an ' . $referral . ' fehlgeschlagen.');
    }
    return $result;
});

// Verzeichnissuche – Verweise werden nun authentifiziert verfolgt
$search = ldap_search($ldap, 'dc=example,dc=com', '(uid=jdoe)');
$entries = ldap_get_entries($ldap, $search);
var_dump($entries['count']);

ldap_unbind($ldap);
int(1)

Registrierten Rebind-Callback wieder entfernen

<?php
$ldap = ldap_connect('ldap://primary.example.com');
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_bind($ldap, 'cn=serviceuser,dc=example,dc=com', 'geheimes_passwort');

// Callback registrieren
ldap_set_rebind_proc($ldap, function (LDAP\Connection $conn, string $referral, int $bindtype): bool {
    return ldap_bind($conn, 'cn=serviceuser,dc=example,dc=com', 'geheimes_passwort');
});

// ... Operationen ...

// Callback entfernen: Verweise werden nicht mehr authentifiziert verfolgt
$success = ldap_set_rebind_proc($ldap, null);
var_dump($success);

ldap_unbind($ldap);
bool(true)

// Wichtig · Fallstricke

Sicherheitshinweis: Zugangsdaten (Benutzername und Passwort) sollten niemals hart im Quellcode kodiert werden. Verwende Umgebungsvariablen oder eine geschützte Konfigurationsdatei, um sensible Informationen zu speichern.

Achtung bei Closures: Wenn der Callback als anonyme Funktion (Closure) mit global oder use auf Zugangsdaten zugreift, können diese ungewollt im Gültigkeitsbereich verbleiben. Bevorzuge die Übergabe über use in der Closure, um den Scope klar zu begrenzen.

PHP-Version: Ab PHP 8.1 ist der erste Parameter vom Typ LDAP\Connection (Objekt) statt der zuvor verwendeten Ressource. Der Callback muss entsprechend angepasst werden, wenn Code von älteren PHP-Versionen migriert wird.

Verweis-Loop-Gefahr: Wenn ein LDAP-Server dauerhaft Verweise auf andere Server ausliefert, kann es zu einer Endlosschleife kommen. Stelle sicher, dass der LDAP-Server korrekt konfiguriert ist und setze ggf. LDAP_OPT_REFERRALS auf 0, um die Verweisverfolgung zu deaktivieren.