PHP/LDAP:错误的搜索过滤器(带有&符号的 OU)
PHP/LDAP: Bad Search Filter (OU with Ampersand)
我不久前写了一个 ldap-authentication-class(使用 Active Directory)并且最近为另一个部门创建了一个新的 Web 应用程序,它使用这个身份验证 class。
基本上用户输入他们的凭据,我的脚本与 AD 绑定并检查用户是否是某个组的成员。密码验证每次都有效,但只有当用户不在名称中带有 & 符号的 OU 中或以下时,检查组成员资格才有效。
问题似乎是,部门名称包含一个符号,因此组织单位也包含一个符号。尽管我在 AD 中拥有更改名称的权限,但很可能其他应用程序通过名称访问该 OU,因此我无法更改它(我也不知道是否有其他 OU 的名称中带有&符号,其中以后可能会出现同样的问题)。
有趣的是:如果我在 windows 下使用 ldp.exe 我可以使用完全相同的搜索过滤器而不会出现任何问题,所以我猜这是符号本身正确传输的问题(我的应用程序使用 UTF-8,并且从 AD 中提取并打印时,& 字符正确显示,所以我认为这不是编码问题)
我用来创建过滤器的行是:
$filter = "(&(objectClass=group)(member:1.2.840.113556.1.4.1941:=".$userdn."))";
where userdn来自另一个ldap_search,我成功验证了用户密码。
我真的被迷住了,因为我实际上从活动目录中提取了我用于组查询的 DN(而且它似乎正确地转义了),但不能在另一个 ldap_search 中使用它。
我已经尝试 escaping/replacing &-Symbol 和一些替代品:
\&
&
%26
还有很多变体,但它们都返回相同的 "bad filter" 错误。
(PHP 版本 5.3.2-1ubuntu4.17)
谁能告诉我我做错了什么?
我终于弄明白了(又过了几个小时)——问题毕竟不是与号,而是一个转义问题——我的用户的 DN 也包含一个逗号,它已经被转义了(所以我还真没想过)。
实际上我必须将转义符号 () 转换为 chr(0x5c)。
这篇文章 ( krivokuca.net/2012/08/... ) 提供了解决方案。
有趣的是:我已经有一个转义函数,可以将“\”转换为“\5c”,但是那个函数对解决这个特殊问题没有帮助。
感谢您为我提供的帮助:)
我不久前写了一个 ldap-authentication-class(使用 Active Directory)并且最近为另一个部门创建了一个新的 Web 应用程序,它使用这个身份验证 class。
基本上用户输入他们的凭据,我的脚本与 AD 绑定并检查用户是否是某个组的成员。密码验证每次都有效,但只有当用户不在名称中带有 & 符号的 OU 中或以下时,检查组成员资格才有效。
问题似乎是,部门名称包含一个符号,因此组织单位也包含一个符号。尽管我在 AD 中拥有更改名称的权限,但很可能其他应用程序通过名称访问该 OU,因此我无法更改它(我也不知道是否有其他 OU 的名称中带有&符号,其中以后可能会出现同样的问题)。
有趣的是:如果我在 windows 下使用 ldp.exe 我可以使用完全相同的搜索过滤器而不会出现任何问题,所以我猜这是符号本身正确传输的问题(我的应用程序使用 UTF-8,并且从 AD 中提取并打印时,& 字符正确显示,所以我认为这不是编码问题)
我用来创建过滤器的行是:
$filter = "(&(objectClass=group)(member:1.2.840.113556.1.4.1941:=".$userdn."))";
where userdn来自另一个ldap_search,我成功验证了用户密码。
我真的被迷住了,因为我实际上从活动目录中提取了我用于组查询的 DN(而且它似乎正确地转义了),但不能在另一个 ldap_search 中使用它。
我已经尝试 escaping/replacing &-Symbol 和一些替代品:
\&
&
%26
还有很多变体,但它们都返回相同的 "bad filter" 错误。
(PHP 版本 5.3.2-1ubuntu4.17)
谁能告诉我我做错了什么?
我终于弄明白了(又过了几个小时)——问题毕竟不是与号,而是一个转义问题——我的用户的 DN 也包含一个逗号,它已经被转义了(所以我还真没想过)。
实际上我必须将转义符号 () 转换为 chr(0x5c)。 这篇文章 ( krivokuca.net/2012/08/... ) 提供了解决方案。
有趣的是:我已经有一个转义函数,可以将“\”转换为“\5c”,但是那个函数对解决这个特殊问题没有帮助。
感谢您为我提供的帮助:)