存储 LDAP 连接并在会话中绑定
Posted
技术标签:
【中文标题】存储 LDAP 连接并在会话中绑定【英文标题】:Store LDAP connection and bind in session 【发布时间】:2012-08-04 14:15:33 【问题描述】:我编写了一个应用程序,其中用户通过 LDAP 进行身份验证和登录。这真的很好用,我只是用他们的凭据做一个ldap_bind()
,如果它是真的,那么就对它们进行身份验证——否则,告诉他们把它吊起来。我可以将他们的用户名保存在会话变量中,这样我就知道他们是谁了。
现在,应用程序的一部分要求用户搜索 LDAP 以查找其他用户。我已经使用jquery-autocomplete
和ldap_search()
来实现这一点,并且效果非常好——用户只需输入用户名、名字或姓氏,所有可能的匹配项都会被建议。可爱的:)
但是,企业 IT 甚至不允许匿名浏览网络内的目录,所以,现在,我将用户名和密码存储在 $_SESSION
中,这样我就可以在每次自动完成脚本时进行新的绑定叫做。我知道它是相当安全的,而且该工具只是内部的,但这感觉像是我不应该真正做的事情,如果它被“放逐到野外”绝对不会做。
我想做的是在他们登录时创建与 LDAP 的绑定,然后以某种方式在整个会话中记住此身份验证,因此我们可以根据需要进行尽可能多的搜索,而无需重新验证每个时间。我无法访问服务器,所以我无法更改那里的任何内容。我可以以某种方式将成功的绑定存储在$_SESSION
中并重用它吗?
如果这不是相对简单,是否有人对如何实施有任何其他建议?
【问题讨论】:
安全说明:如果密码为空并且您的 LDAP 服务器配置为接受匿名身份验证,ldap_bind()
将返回 true
。因此,请务必转义特殊字符,然后检查 length > 0
。
@Morris Fauntleroy 你能找到解决方案吗?
【参考方案1】:
您不能序列化资源类型(这是 ldap_connect() 返回的内容)。
我们在类似情况下所做的是使用特定的 LDAP 帐户,该帐户仅在 LDAP 树(以及特定类型的数据,如姓名、姓氏、电子邮件)上具有搜索权限,而没有其他权限。此用户的帐户凭据存储在数据库中。
也许要应用第二级安全性,您可以允许该用户仅从特定 IP 进行连接(我认为 LDAP 服务器支持这一点,但我不是 100% 确定)。因此,即使凭据被泄露,它们实际上也毫无用处
【讨论】:
您能否限制这个专用用户以防止 DOS 攻击? @Will,这肯定是可取的,尤其是在无法链接到特定 IP 的情况下,这很好。【参考方案2】: 与 LDAP 兼容服务器的初始连接是匿名的 成功的 BIND 请求会更改连接的身份验证状态 不成功的 BIND 请求(或具有零长度 DN 和密码的 BIND 请求)会将身份验证状态重置为匿名。因此,一旦连接通过身份验证,直到成功处理 BIND 请求,连接将保持其身份验证状态。这意味着连接可以保持打开状态并在连接上传输操作,直到连接被服务器或客户端关闭。
请注意,符合 LDAP 的服务器可以选择发送不是对客户端请求的响应的主动通知。现代的、专业品质的服务器将使用这种机制来通知客户端,无论出于何种原因,服务器正在关闭连接。
简而言之,保持连接并继续使用它。更好的是,建立一个与服务器连接的身份验证池。
更新:
与符合 LDAP 的服务器的连接可以保持打开状态,并且可以用于客户端希望(并且服务器允许)的任意数量的事务(请求-响应对)。 LDAP 允许每个连接进行多个事务,并且还允许异步连接。
【讨论】:
以上是关于存储 LDAP 连接并在会话中绑定的主要内容,如果未能解决你的问题,请参考以下文章