Signatur
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
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);
?>
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);
?>
// 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.