gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-10-31 23:29:47 26 4
gpt4 key购买 nike

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

基本上用户输入他们的凭据,我的脚本与 AD 绑定(bind)并检查用户是否是某个组的成员。密码验证每次都有效,但只有在用户不在名称中带有 & 符号的 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 版本 5.3.2-1ubuntu4.17)

谁能告诉我我做错了什么?

最佳答案

我终于弄明白了(又过了几个小时)——问题毕竟不是与号,而是一个转义问题——我的用户的 DN 也包含一个逗号,它已经被转义了(所以我没有不要真的去想它)。

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

有趣的是:我已经有了一个转义函数,它可以将“\”转换为“\5c”,但是那个函数对解决这个特殊问题没有帮助。

感谢您为我提供的帮助 :)

关于PHP/LDAP : Bad Search Filter (OU with Ampersand),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31588729/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com