PHP/LDAP:错误的搜索过滤器(带有&号的OU)


PHP/LDAP: Bad Search Filter (OU with Ampersand)

我不久前写了一个ldap-authentication-class(与Active Directory一起工作),最近为另一个部门创建了一个新的web应用程序,该应用程序使用这个身份验证类。

基本上用户输入他们的凭据,我的脚本与AD绑定并检查用户是否是某个组的成员。密码身份验证每次都有效,但是检查组成员关系仅在用户不在其名称中带有&号的OU中或其下时才有效。

问题似乎是,部门名称包含一个&,因此组织单位也包含一个&。尽管我在AD中有更改名称的权限,但很可能其他应用程序通过名称访问该OU,因此我无法更改它(我也不知道是否有其他名称中带有&号的OU,以后可能会出现同样的问题)。

有趣的事情:如果我在windows下使用ldp.exe,我可以使用完全相同的搜索过滤器没有任何问题,所以我猜这是符号本身的正确传输问题(我的应用程序使用UTF-8和&字符从AD拉出并打印时正确显示,所以我不认为这是一个编码问题)

我用来创建过滤器的行是:

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

,其中userdn来自另一个ldap_search到,我成功地验证了用户密码。

我真的很困惑,因为我实际上从活动目录中提取了用于组查询的DN(并且它似乎正确转义了),但不能在另一个ldap_search中使用它。

我已经尝试用一些替代方法转义/替换&-符号:

'&

&

%26

和它们的许多变体,但它们都返回相同的"坏过滤器"错误。

(PHP Version 5.3.2-1ubuntu4.17)

谁能告诉我我在这里做错了什么?

我终于弄明白了(在额外的几个小时之后)-问题毕竟不是与符号,而是一个转义问题-我的用户的DN还包含一个逗号,它已经被转义了(所以我没有真正考虑它)。

实际上我必须将转义符号()转换为chr(0x5c)。这篇文章(krivokuca.net/2012/08/…)给出了解决方案。

有趣的是:我已经有了一个转义函数,它将"'"转换为"'5c",但那个函数对这个特殊问题没有帮助。

谢谢你对我的帮助