【问题标题】:PHP wrong phpsessidPHP 错误 phpsessid
【发布时间】:2014-12-28 09:43:40
【问题描述】:

我有一个网站,有时用户会收到不正确的会话数据。我一直在用两个不同的用户快速登录测试它。我发现当用户 A 获取用户 B 的会话数据时,来自 session_id() 的 phpsessid 不等于浏览器中的 PHPSESSID cookie。

代码是这样的:

登录.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');

【问题讨论】:

  • 您能否解释一下以下场景是如何发生的:“我发现当用户 A 获取用户 B 的会话数据时,来自 session_id() 的 phpsessid 不等于浏览器中的 PHPSESSID cookie。”
  • 您使用两种不同的浏览器进行了测试,不是吗?
  • @ForguesR 它发生在 IE7 和 Chrome 中。首先我使用用户 A 登录,然后快速注销并使用用户 B 登录。重复此操作直到失败。
  • 您必须在用户注销时使用session_destroy();。那么这样的事情就永远不会发生了。
  • @jankal 我添加了我的注销文件。

标签: php session redirect


【解决方案1】:

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

  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.

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2019-06-05
    • 2014-08-03
    • 1970-01-01
    • 2016-12-16
    • 2023-03-04
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 2011-02-16
    相关资源
    最近更新 更多