ldap — функция ldap_connect () в php принимает любое значение и не выдает ошибку

Я пишу код php для подключения к моему серверу LDAP.

$adServer = $ini['ldap'];
$ldap = ldap_connect($adServer) or die("Could not connect to {$adServer}");

Значение для $adServer Я загружаю из файла конфигурации.

Похоже ldap_connect() не выдает ошибку, когда я передаю пустое значение или любое другое случайное значение, такое как «Hello».

Я попытался дать приведенный ниже код, чтобы проверить, было ли сгенерировано какое-либо сообщение об ошибке.

echo ldap_error($ldap)

Это всегда говорит «Успех».

Следовательно, я не могу проверить подлинность соединения с LDAP-сервером и установить соответствующее сообщение об ошибке.

В какой ситуации срабатывает «умереть» ldap_connect() функция.
Я хотел бы выдать соответствующее сообщение об ошибке конечному пользователю, если имя сервера, указанное в файле конфигурации, не работает.

Примечание: я использую версию 5.6 для PHP

0

Решение

ldap_connect() всегда возвращает ресурс, когда он может проанализировать предоставленный параметр как URL. Первый раз, когда ресурс фактически используется (и, следовательно, устанавливается соединение, и возможный сбой может быть обнаружен), это когда используется ldap_bind(),

Как ldap_connect() почти всегда возвращает дескриптор ресурса (как описано в http://php.net/ldap_connect) ваша конструкция с die() не будет делать то, что вы хотите. Это будет работать только в том случае, если указанный параметр не может быть внутренне проанализирован как URL. так что пока вы предоставляете строку, которая выглядит как имя сервера или URL, все работает.

Я всегда проверяю после неудачного ldap_bind() что именно произошло, а затем выдать исключение в зависимости от ошибки, возвращенной. В качестве альтернативы я иногда проверяю перед использованием ldap_bind() открыв (и просто закрыв) соединение с помощью f.i fsockopen(), Если это соединение не может быть открыто, ldap-соединение также не будет работать.

Примеры упомянутой php-документации ошибочны, и, похоже, нам придется их изменить. Так что спасибо за то, что обнаружили и подбросили вопрос!

Кстати: звонит @ldap_connect('ldap:'); например, был бы такой случай, когда die() будет работать, так как это неполный URL. Или используя строку с пробелами.

1

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

Я нашел лучший способ сделать аутентификацию вместо использования die.
После подключения ldap мы продолжаем использовать ldap bind. Если привязка не удалась, мы можем проверить ошибку ldap.

$ldap = @ldap_connect($adServer);
$bind = @ldap_bind ($ldap, $ldaprdn, $password);
if (!$bind) {  // If Bind Failed then.
if (ldap_errno ($ldap) == 49 {
//Invalid Credentials
} else {
//LDAP Connection to LDAP Server Failed
}
}

Для получения списка всех номеров ошибок LDAP, вы можете проверить Вот

0

По вопросам рекламы [email protected]