Signatur
Beschreibung
ldap_connect() initialisiert eine Verbindung zu einem LDAP-Server und gibt ein LDAP\Connection-Objekt zurück, das für nachfolgende LDAP-Operationen wie ldap_bind(), ldap_search() oder ldap_modify() benötigt wird. Die eigentliche TCP-Verbindung wird dabei nicht sofort aufgebaut – das geschieht erst beim ersten tatsächlichen Vorgang (z. B. beim Binden).
Als Argument wird eine LDAP-URI im Format ldap://hostname:port oder ldaps://hostname:port übergeben. Das Präfix ldaps:// aktiviert eine verschlüsselte LDAP-Verbindung über SSL/TLS (LDAPS, standardmäßig Port 636). Soll STARTTLS verwendet werden, wird zunächst eine normale Verbindung aufgebaut und anschließend ldap_start_tls() aufgerufen.
Seit PHP 8.3 ist die frühere Signatur mit separaten Parametern $host und $port als veraltet markiert. Es sollte stets eine vollständige LDAP-URI verwendet werden. Seit PHP 8.1 gibt die Funktion ein LDAP\Connection-Objekt zurück anstelle einer Ressource.
LDAP eignet sich für die Anbindung an Verzeichnisdienste wie Active Directory, OpenLDAP oder LDAP-basierte Authentifizierungssysteme. Verbindungsoptionen wie Protokollversion oder Timeout können nach dem Verbindungsaufbau mit ldap_set_option() gesetzt werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $uri | string|null | null | Eine vollständige LDAP-URI, z. B. ldap://ldap.example.com, ldap://ldap.example.com:389 oder ldaps://ldap.example.com:636. Mehrere URIs können durch Leerzeichen getrennt übergeben werden. Bei null wird localhost auf Port 389 verwendet. |
Rückgabewert
LDAP\Connection-Objekt zurück (vor PHP 8.1 eine Ressource vom Typ ldap link). Gibt false zurück, wenn die LDAP-URI ungültig ist oder die Verbindung nicht initialisiert werden konnte.Beispiele
Einfache LDAP-Verbindung mit anonymem Bind
<?php
$conn = ldap_connect('ldap://ldap.example.com');
if ($conn === false) {
die('LDAP-Verbindung konnte nicht initialisiert werden.');
}
// Protokollversion auf LDAPv3 setzen
ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($conn, LDAP_OPT_REFERRALS, 0);
// Anonymer Bind
if (ldap_bind($conn)) {
echo 'Erfolgreich anonym verbunden.';
} else {
echo 'Bind fehlgeschlagen: ' . ldap_error($conn);
}
ldap_unbind($conn);
Verbindung zu Active Directory mit Benutzer-Authentifizierung
<?php
$ldapUri = 'ldap://ad.example.com:389';
$bindDn = 'CN=ServiceUser,OU=Users,DC=example,DC=com';
$bindPass = 's3cr3tP@ssword';
$baseDn = 'DC=example,DC=com';
$conn = ldap_connect($ldapUri);
if ($conn === false) {
die('Ungültige LDAP-URI.');
}
ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($conn, LDAP_OPT_REFERRALS, 0);
if (!ldap_bind($conn, $bindDn, $bindPass)) {
die('Bind fehlgeschlagen: ' . ldap_error($conn));
}
$filter = '(sAMAccountName=jdoe)';
$result = ldap_search($conn, $baseDn, $filter, ['cn', 'mail']);
$entries = ldap_get_entries($conn, $result);
if ($entries['count'] > 0) {
echo 'Gefundener Benutzer: ' . $entries[0]['cn'][0] . PHP_EOL;
echo 'E-Mail: ' . $entries[0]['mail'][0] . PHP_EOL;
} else {
echo 'Kein Benutzer gefunden.';
}
ldap_unbind($conn);
Verschlüsselte Verbindung mit LDAPS
<?php
// LDAPS (Port 636) für verschlüsselte Übertragung
$conn = ldap_connect('ldaps://ldap.example.com:636');
if ($conn === false) {
die('LDAPS-Verbindung fehlgeschlagen.');
}
ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3);
// Zertifikatsvalidierung erzwingen (Produktivumgebung)
// ldap_set_option(null, LDAP_OPT_X_TLS_REQUIRE_CERT, LDAP_OPT_X_TLS_DEMAND);
if (ldap_bind($conn, 'cn=admin,dc=example,dc=com', 'adminpass')) {
echo 'Sicher über LDAPS verbunden.';
}
ldap_unbind($conn);
// Wichtig · Fallstricke
Sicherheitshinweis: Verbindungen über ldap:// übertragen Daten unverschlüsselt, einschließlich Passwörter beim Bind. In Produktivumgebungen sollte stets ldaps:// oder STARTTLS (ldap_start_tls()) verwendet werden.
LDAP-Injection: Benutzereingaben, die in LDAP-Filtern oder DN-Ausdrücken verwendet werden, müssen mit ldap_escape() escapet werden, um LDAP-Injection-Angriffe zu verhindern.
Deprecation: Die alte Signatur ldap_connect(string $host, int $port) mit separatem Port-Parameter ist seit PHP 8.3 als veraltet (deprecated) markiert und wird in einer zukünftigen PHP-Version entfernt. Stets eine vollständige URI verwenden.
PHP 8.1: Ab PHP 8.1 gibt ldap_connect() ein LDAP\Connection-Objekt zurück. Code, der mit is_resource() prüft, muss auf instanceof LDAP\Connection umgestellt werden.