2010-05-28 96 views
3

$ _SERVER ['REMOTE_USER']返回登录到Active Directory的用户的用户名。我想通过使用ldap_search()来检索这个用户信息。PHP - ldap_search()过滤器。如何搜索用户

这是我现在有:

$ad = // ldap_connection id 
$filter = "(|(sn=$username*)(givenname=$username*))"; 
$attr = array("displayname", "mail", "mobile", "homephone", "telephonenumber", "streetaddress", "postalcode", "physicaldeliveryofficename", "l"); 
$dn = // OU, DC etc.. 

ldap_search($ad,$dn,$filter,$attr); 

它的工作原理,但我不知道,如果两个用户几乎具有相同的名称,将工作。 我如何只搜索他们的唯一用户名,以便我只能得到一个用户?

+0

$过滤器=“(SAM帐户= $用户名)“; < - 这是正确的吗? “samaccountname”是唯一的用户名权限? – horgen 2010-05-28 07:33:32

回答

4

sAMAccountName在Active Directory中使用的用户名,属性,所以(&(objectClass=user)(sAMAccountName=%s))会(通过实际的用户名被自然替换%s)正确的过滤器来检查给定用户名的LDAP。

请注意,你需要处理特殊字符在$username避免畸形的过滤器或在最坏的恶意LDAP注射(见RFC 2254):

与ACII 代码的任何控制字符< 32以及字符 与LDAP过滤器 特殊含义“*”,“(”,“)”,和“\”(反斜线) 被转换成反斜线的表示 随后是代表两个十六进制 数字十六进制mal 字符的值。

3

ldap_search()会找到所有匹配的条目,您将不得不验证结果。 假设$link是你的链接到与ldap_connect() ldap_get_entries($连接,$结果)创建的LDAP数据库 您可以验证这样的:

$result = ldap_search(); 
if(ldap_count_entries($link, $result) === 1) { 
    ... 
} 

$result = ldap_search(); 
$entries = ldap_get_entries($link, $result); 
if(sizeof($entries) === 1) { 
    ... 
}