У меня есть этот код, удостоверяющий мои пользователи в отношении каталога LDAP. Он возвращает false, когда есть неправильный пароль, но если пароль остается пустым, он все равно аутентифицирует пользователя. Любые идеи, почему это может произойти?
if (@ldap_bind($ds, $user_dn, $password) || sha1($password) == '484h84h4hf4Ffwj49393393j93j')
{
$valid = true;
}
else $valid = false;
Если вы предоставляете пустой пароль, он указывает серверу каталогов, что вы выполняете анонимное простое связывание. Такое поведение описано в разделе 4.2.2 RFC 2251:
If no authentication is to be performed, then the simple
authentication option MUST be chosen, and the password be of zero
length. (This is often done by LDAPv2 clients.) Typically the DN is
also of zero length.
Это может быть довольно распространенным явлением безопасности в LDAP-клиентах, потому что, если они не подтверждают, что пользователь предоставил непустой пароль, но попытаются связать с непустым DN и пустым паролем, тогда они смогут увидеть, что он преуспевает, когда сервер не связывался как пользователь, указанный предоставленным DN, а скорее связанный анонимно. Поскольку это такая общая проблема безопасности в LDAP-клиентах, некоторые серверы отклоняют запросы на связывание с непустым DN, но пустым паролем, и это поведение поощряется самыми последними спецификациями LDAPv3, как указано в RFC 4513, раздел 5.1.2:
An LDAP client may use the unauthenticated authentication mechanism
of the simple Bind method to establish an anonymous authorization
state by sending a Bind request with a name value (a distinguished
name in LDAP string form [RFC4514] of non-zero length) and specifying
the simple authentication choice containing a password value of zero
length.
The distinguished name value provided by the client is intended to be
used for trace (e.g., logging) purposes only. The value is not to be
authenticated or otherwise validated (including verification that the
DN refers to an existing directory object). The value is not to be
used (directly or indirectly) for authorization purposes.
Unauthenticated Bind operations can have significant security issues
(see Section 6.3.1). In particular, users intending to perform
Name/Password Authentication may inadvertently provide an empty
password and thus cause poorly implemented clients to request
Unauthenticated access. Clients SHOULD be implemented to require
user selection of the Unauthenticated Authentication Mechanism by
means other than user input of an empty password. Clients SHOULD
disallow an empty password input to a Name/Password Authentication
user interface. Additionally, Servers SHOULD by default fail
Unauthenticated Bind requests with a resultCode of
unwillingToPerform.
Похоже, ваш сервер этого не делает. Если у него есть возможность сделать это, я бы настоятельно рекомендовал включить его. Но, во всяком случае, хорошо спроектированный клиент LDAP, который использует простые операции привязки для проверки учетных данных пользователя, должен абсолютно убедиться, что пользователь предоставил непустую строку, прежде чем пытаться использовать ее для привязки к серверу.