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

时间:2015-07-23 13:24:55

标签: php ldap ampersand

前段时间我编写了一个ldap-authentication-class(使用Active Directory),最近为另一个使用此身份验证类的部门创建了一个新的Web-Application。

基本上用户输入他们的凭证,我的脚本与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中使用它。

我已经尝试用一些替代品来逃避/替换& -Symbol:

\&

&

%26

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

(PHP Version 5.3.2-1ubuntu4.17)

有人能告诉我这里做错了吗?

1 个答案:

答案 0 :(得分:2)

我终于弄清楚了(经过几个小时后) - 问题根本不是&符号,但这是一个逃避问题 - 我的用户的DN也包含一个逗号,它已经被转义(所以我没有&# 39;真的想一想。)

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

有趣的是:我已经有了一个转义功能,转换了#34; \"到" \ 5c",但那个人没有帮助解决这个问题。

感谢您帮助我的努力:)