PHP wrong phpsessid


PHP wrong phpsessid

我有一个网站,有时用户会在那里获得不正确的会话数据。我一直在测试它与两个不同的用户快速登录。我发现,当用户A获取用户B的会话数据时,session_id()中的phpsession与浏览器中的PHPSSID cookie不相等。

代码是这样的:

login.php

if(isset($_POST['uname']) && isset($_POST['password'])){
    $logged = login($_POST['uname'],$_POST['password']);
    if($logged){
        header( 'Location: index.php' ) ;
        exit();
    }
}    
function login($uname,$password){
    $user = check_db_user($uname,$password)
    if($user){
        session_regenerate_id(TRUE);
        $_SESSION["name"] = $user->name;
        ...
        return true;
    }else{
        return false;
    }
}

登录操作正常。在index.php中,我看到了错误会话数据的问题。如果发生这种情况,我只需要重新加载页面,它就会呈现正确的会话数据。所以,我认为问题是重定向到index.php没有发送正确的php会话id。我已经尝试添加

header("Set-Cookie: PHPSESSID=" . session_id() . "; path=/"); 

在重定向之前,但它仍然不起作用。

注销.php

session_start();
$_SESSION = array();
if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,$params["path"],
    $params["domain"],$params["secure"], $params["httponly"]);
}
session_destroy();
session_regenerate_id(TRUE);
header('location:login.php');

我认为您的身份验证有几个漏洞。

  1. 我没有看到session_start();在您的登录处理部分
  2. 应该对表单传递的参数进行筛选
  3. 我认为您在未编码的情况下将用户名存储在$_SESSION中。这也是一个安全风险

这是我以前用的代码。很抱歉,如果存在复制/剪切/粘贴错误。注意:我在调用login()之前验证我的输入。

    <?php
    define("YOUR_COOKIE,",  'your_bakery' );
    define("HASH_SALT",  'your_salt' );
    function login( $uname, $passwd ) {
        $loginIsOK = FALSE;
        $this->userInfo = dbUser( $uname );
        if ( ! empty( $this->userInfo ) &&
             ( $this->userInfo['pwd'] == sha1( $passwd.HASH_SALT ) ) ) {
            $this->userInfo['hashedUsername'] = sha1( $uname.HASH_SALT );
            $ses_id = session_id();
            $hour = time() + 46000; //1hour = 3600                                  
            setcookie( YOUR_COOKIE, $this->userInfo['hashedUsername'], $hour );
            $xtd=getdate();
            $this->userInfo['lastLogin'] = date('Y-M-d H:i:s',$xtd[0]);
            $this->userInfo['loginCount'] = $this->userInfo['loginCount'] + 1;
            $this->userInfo['sessionId'] = $ses_id;
            dbUserUpdate( $this->userInfo );
            $loginIsOK = TRUE;
        }
        return( $loginIsOK );
    }
    // for the login check:                                                         
    function isLogedIn() {
        if ( empty( $this->userInfo ) )
            return false;
        $ses_id = session_id();
        if ( empty( $this->userInfo['sessionId']) ) {
            return false;
        }
        else if ( $ses_id != $this->userInfo['sessionId'] )  {
            $xLoginColision = $this->userInfo['sessionIdCollisions'] + 1;
            $this->userInfo['sessionIdCollisions'] = $xLoginColision;
            dbUserUpdate( $this->userInfo );
            return false;
        }
        else
            return true;
    }
// Then for logout the only thing needed is:                                    
$past = time() - 100;  //this makes the time in the past to destroy the cookie  
setcookie( YOUR_COOKIE, $past );
//you can also change the session id.

我希望这能有所帮助。