Start · Sprachen · PHP · Referenz · ldap_exop_sync

ldap_exop_sync

Funktion

Führt eine synchrone erweiterte LDAP-Operation (Extended Operation) auf einem LDAP-Server aus und liefert das Ergebnis direkt zurück.

seit PHP 7.2.0 Kategorie: misc

Signatur

ldap_exop_sync(LDAP\Connection $ldap, string $request_oid, string $request_data = "", array $controls = [], string &$response_data = null, string &$response_oid = null): bool

Beschreibung

Die Funktion ldap_exop_sync() sendet eine erweiterte LDAP-Operation (gemäß RFC 4511) an den verbundenen LDAP-Server und wartet synchron auf die Antwort. Erweiterte Operationen ermöglichen es, Fähigkeiten über das Basis-LDAP-Protokoll hinaus zu nutzen – typische Beispiele sind Password Modify (1.3.6.1.4.1.4203.1.11.1), StartTLS oder Who Am I? (1.3.6.1.4.1.4203.1.11.3).

Im Gegensatz zur asynchronen Variante ldap_exop() blockiert ldap_exop_sync() so lange, bis die Antwort des Servers vorliegt. Das erleichtert die Verwendung in sequenziellen Skripten erheblich, da kein explizites Warten auf das Ergebnis mit ldap_parse_exop() und ldap_free_result() notwendig ist.

Der Rückgabewert der Antwort des LDAP-Servers wird in den per Referenz übergebenen Parametern $response_data und $response_oid bereitgestellt. Mittels $controls können Server-seitige Steuerungsparameter (LDAP-Controls) übergeben werden, wie sie etwa für das Paging von Suchergebnissen oder sicherheitsrelevante Erweiterungen benötigt werden.

Diese Funktion eignet sich besonders, wenn Passwörter über die Password Modify Extended Operation geändert oder serverseitige Identitäten mit Who Am I? abgefragt werden sollen, ohne den komplexeren asynchronen Ablauf verwenden zu müssen.

Parameter

Name Typ Default Beschreibung
$ldap Pflicht LDAP\Connection Eine gültige LDAP-Verbindungsressource, wie sie von ldap_connect() zurückgegeben wird.
$request_oid Pflicht string Die OID (Object Identifier) der gewünschten erweiterten Operation, z. B. LDAP_EXOP_WHO_AM_I oder LDAP_EXOP_MODIFY_PASSWD.
$request_data string "" BER-kodierte Anfragedaten, die an den LDAP-Server gesendet werden. Kann leer sein, wenn die Operation keine zusätzlichen Daten erfordert (z. B. Who Am I?).
$controls array [] Ein Array von LDAP-Controls, die mit der Anfrage gesendet werden sollen. Jedes Element ist ein assoziatives Array mit den Schlüsseln oid, iscritical und optional value.
$response_data string null Wird per Referenz übergeben und enthält nach dem Aufruf die BER-kodierten Antwortdaten des Servers, sofern vorhanden.
$response_oid string null Wird per Referenz übergeben und enthält nach dem Aufruf die OID der Serverantwort, sofern der Server eine zurückliefert.

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei Erfolg zurück, false bei einem Fehler (z. B. wenn die Verbindung ungültig ist oder der Server die Operation ablehnt).

Beispiele

Abfrage der Serveridentität mit Who Am I?

<?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', 'geheimesPasswort');

$responseData = '';
$responseOid  = '';

$success = ldap_exop_sync(
    $ldap,
    LDAP_EXOP_WHO_AM_I,
    '',
    [],
    $responseData,
    $responseOid
);

if ($success) {
    echo "Eingeloggt als: " . $responseData . PHP_EOL;
} else {
    echo "Fehler bei der Who-Am-I-Anfrage." . PHP_EOL;
}

ldap_unbind($ldap);
?>
Eingeloggt als: dn:cn=admin,dc=example,dc=com

Passwort eines LDAP-Benutzers ändern (Password Modify Extended Operation)

<?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', 'geheimesPasswort');

// BER-kodierte Anfrage für Password Modify erstellen
// (Hier vereinfacht als Beispiel – in der Praxis wird ldap_exop() mit
// LDAP_EXOP_MODIFY_PASSWD und korrekter BER-Kodierung verwendet)
$requestData = "";
// Viele Bibliotheken stellen Hilfsfunktionen bereit; hier direkt die OID nutzen:
$success = ldap_exop_sync(
    $ldap,
    LDAP_EXOP_MODIFY_PASSWD,
    $requestData,
    [],
    $responseData
);

if ($success) {
    echo "Passwort erfolgreich geändert." . PHP_EOL;
    if (!empty($responseData)) {
        echo "Serverantwort (BER): " . bin2hex($responseData) . PHP_EOL;
    }
} else {
    $errno = ldap_errno($ldap);
    echo "Fehler beim Ändern des Passworts. LDAP-Fehlercode: $errno" . PHP_EOL;
}

ldap_unbind($ldap);
?>
Passwort erfolgreich geändert.

// Wichtig · Fallstricke

Sicherheitshinweis: Erweiterte LDAP-Operationen, insbesondere Password Modify, sollten ausschließlich über eine verschlüsselte Verbindung (ldaps:// oder mit StartTLS via ldap_start_tls()) durchgeführt werden, um das Abfangen von Zugangsdaten zu verhindern.

BER-Kodierung: Die Parameter $request_data und $response_data verwenden BER (Basic Encoding Rules). Für komplexere Operationen empfiehlt sich die Verwendung einer dedizierten BER-Bibliothek oder die Nutzung der höherstufigen LDAP-Hilfsfunktionen von PHP, da fehlerhafte BER-Daten zu unerwarteten Serverfehlern führen können.

Verfügbarkeit: Die Konstanten LDAP_EXOP_WHO_AM_I, LDAP_EXOP_MODIFY_PASSWD etc. sind ab PHP 7.2 verfügbar. Prüfe mit phpinfo() oder defined(), ob die benötigten Konstanten in deiner PHP-Installation vorhanden sind.

Ab PHP 8.1 wurde der Typ des ersten Parameters von resource auf LDAP\Connection geändert.