PHP - фильтр ldap_search (). Как искать пользователя - PullRequest
3 голосов
/ 28 мая 2010

$ _ SERVER ['REMOTE_USER'] возвращает имя пользователя, вошедшего в Active Directory. Я хочу получить информацию об этом пользователе с помощью ldap_search ().

Вот что у меня сейчас:

$ad = // ldap_connection id
$filter = "(|(sn=$username*)(givenname=$username*))";
$attr = array("displayname", "mail", "mobile", "homephone", "telephonenumber", "streetaddress", "postalcode", "physicaldeliveryofficename", "l");
$dn = // OU, DC etc..

ldap_search($ad,$dn,$filter,$attr);

Это работает, но я не уверен, что это будет работать, если два пользователя имеют почти одинаковые имена. Как мне искать только их уникальное имя пользователя, чтобы у меня всегда был только один пользователь?

Ответы [ 2 ]

4 голосов
/ 28 мая 2010

sAMAccountName является атрибутом имени пользователя, используемым в Active Directory, поэтому (&(objectClass=user)(sAMAccountName=%s)) будет правильным фильтром для проверки LDAP на заданное имя пользователя (при этом %s будет заменено фактическим именем пользователя естественным образом).

Обратите внимание, что вам нужно обрабатывать специальные символы в $username, чтобы избежать некорректных фильтров или, в худшем случае, вредоносных инъекций LDAP (см. RFC 2254 ):

Любые управляющие символы с ACII код <32, а также символы с особым значением в фильтрах LDAP "*", "(", ")" и "\" (обратный слеш) превращаются в представление обратной косой черты, за которой следуют два гекса цифры, представляющие шестнадцатеричное значение символа. </p>

3 голосов
/ 28 мая 2010

ldap_search() найдет все подходящие записи, вам нужно будет проверить результат. Допустим, $link - ваша ссылка на базу данных LDAP, созданную с помощью ldap_connect() ldap_get_entries ($ link, $ result) Вы можете проверить это следующим образом:

$result = ldap_search();
if(ldap_count_entries($link, $result) === 1) {
    ...
}

или

$result = ldap_search();
$entries = ldap_get_entries($link, $result);
if(sizeof($entries) === 1) {
    ...
}
...