PHP:跨请求保持LDAP连接

时间:2013-03-14 19:43:35

标签: php session encryption ldap

我有一个(我认为并非罕见)情景:

我的PHP应用程序查询LDAP服务器以处理身份验证。 LDAP服务器仅接受经过身份验证的访问,因此第一个ldap_bind()调用实际上用作身份验证机制并检索登录用户的基本信息。

到目前为止一切顺利。但是,当我想使用LDAP服务执行其他查询(例如登录用户或其他用户的额外信息)时,我必须再次通过LDAP身份验证。

想要在会话中存储用户的密码,因为它可能会泄漏,但我不能让用户在每次请求时进行身份验证,以便为LDAP服务器提供凭据。

所以我考虑了以下解决方案:

  1. 将LDAP连接句柄存储在会话中,因此我不必每次都提供凭据。这不起作用,因为句柄是资源,无法为会话存储序列化。
  2. 将密码存储在会话中,但已加密。加密种子可以从一些易变的var中导出,例如,会话ID的哈希值,因此它不会存储在var中,并且永远不会泄漏。
  3. <Your idea here>
  4. 有什么想法?

    由于

2 个答案:

答案 0 :(得分:1)

我的两分钱......我认为首次使用案例可以避免在您第一次连接时为用户提取所有内容。将所有内容减去会话中的密码。第二种情况:您是否需要以用户X身份验证才能访问该数据?您是否可以创建具有读访问权限的用户并使用这些凭据(App用户)来查询这些类型的事物。或者,也许用户信息不应该存在于AD中。使用它进行身份验证,但将用户数据保存在DB(主服务器)中,或者从AD(从服务器)同步到DB中。

答案 1 :(得分:0)

至于存储密码,这是有效的(使用Yii框架,但它很容易适应vanilla PHP):

public function getUserPW(){
    if(empty(Yii::app()->user->sneak)) return false;

    $seed=sha1(Yii::app()->session->sessionID);
    $iv=substr(md5(Yii::app()->session->sessionID),0,16);

    return openssl_decrypt(Yii::app()->user->sneak,self::CRYPT_ALGO,$seed,false,$iv);
}

public function setUserPW($pw){
    $seed=sha1(Yii::app()->session->sessionID);
    $iv=substr(md5(Yii::app()->session->sessionID),0,16);

    Yii::app()->user->setState('sneak',
        openssl_encrypt($pw,self::CRYPT_ALGO,$seed,false,$iv)
    );
}