PHP / LDAP: фильтр плохого поиска (OU с амперсандом)

Я написал класс ldap-authentication-mode (работающий с Active Directory) и недавно создал новое веб-приложение для другого отдела, который использует этот класс аутентификации.

В основном пользователь вводит свои учетные данные, мой скрипт связывается с AD и проверяет, является ли пользователь членом определенной группы. Аутентификация по паролю работает каждый раз, но проверка членства в группах работает только в том случае, если пользователь не находится в или ниже OU с амперсандом в его имени.

Кажется, проблема в том, что название отдела содержит амперсанд, и, следовательно, организационное подразделение тоже. Несмотря на то, что в AD у меня есть разрешения на изменение имени, наиболее вероятно, что другие приложения обращаются к этому OU по имени, поэтому я не могу его изменить (также я не знаю, есть ли другие OU с амперсандами в именах, где та же проблема может возникнуть позже).

Забавная вещь: если я использую ldp.exe под Windows, я могу без проблем использовать точно такой же фильтр поиска, поэтому я думаю, что это проблема с правильной передачей самого символа (мое приложение использует UTF-8 и символ амперсанда) отображается правильно при извлечении из AD и печати, поэтому я не думаю, что это проблема кодирования)

Строка, которую я использую для создания фильтра:

$filter = "(&(objectClass=group)(member:1.2.840.113556.1.4.1941:=".$userdn."))";

куда userdn приходит из другого ldap_search, где я успешно проверил пароль пользователя.

Я действительно споткнулся, потому что я на самом деле извлекаю DN, который я использую для группового запроса, из активного каталога (и кажется, что он правильно экранирован), но не могу использовать его в другом ldap_search.

Я уже пытался избежать / заменить &-Символ с некоторыми альтернативами:

\&

&

%26

и много их вариантов, но все они повторяют одну и ту же ошибку «плохого фильтра».

(PHP версии 5.3.2-1ubuntu4.17)

Кто-нибудь может сказать мне, что я здесь делаю неправильно?

4

Решение

Я наконец-то понял это (через несколько дополнительных часов) — проблема была не в амперсанде, а в том, что это была проблема с выходом — DN моего пользователя также содержал запятую, которая уже была экранирована (так что я на самом деле не думал об этом).

На самом деле мне пришлось преобразовать escape-символ () в chr (0x5c).
Эта статья (krivokuca.net/2012/08/…) имела решение.

Забавная вещь: у меня уже была экранирующая функция, которая конвертировала «\» в «\ 5c», но эта не помогла в этом конкретном случае.

Спасибо за усилия, чтобы помочь мне 🙂

2

Другие решения

Других решений пока нет …