0

我有一个(我认为并不少见)场景:

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

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

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

所以我想到了以下解决方案:

  1. 将 LDAP 连接句柄存储在会话中,因此我不必每次都提供凭据。这是行不通的,因为句柄是一种资源,不能为会话存储而序列化。
  2. 将密码存储在会话中,但已加密。加密种子可以从一些易失的变量中派生出来,例如会话 ID 的散列,这样它就不会存储在变量中并且永远不会泄漏。
  3. <Your idea here>

有什么想法吗?

谢谢

通用汽车

4

2 回答 2

1

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

于 2013-03-14T19:54:30.517 回答
0

至于存储密码,这是可行的(使用 Yii 框架,但很容易适应原生 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)
    );
}
于 2013-03-14T20:53:34.430 回答