PHP验证SESSION变量时出错

时间:2014-09-18 14:01:34

标签: php mysql

所以我在这里建立了一个登录系统,启动一个会话,检查密码是否正确,然后设置会话变量。

以下是您可能需要注意的一些事项:

  • 成功登录
  • mysql连接没有问题
  • 所有文件都在文件夹中正确放置
  • 没有警告或错误消息
  • MYSQL表结构正确且数据库中没有错误

注意:我要定义的所有功能都在同一个文件' functions.php'

在这里,我们有会话功能

include_once("global_config.php");
include_once("db_connect.php");
function sec_session_start()
{
    $session_name = 'sec_session_id';
    $secure = SECURE;
    $httponly = true;
    if(ini_set('session.use_only_cookies', 1) === FALSE)
    {
        echo "Could not initiate a secure session";
        exit;
    }

    $cookieparams = session_get_cookie_params();
    session_set_cookie_params($cookieparams['lifetime'],$cookieparams['path'],$cookieparams['domain'],$secure,$httponly);
    session_name($session_name);
    session_start();
    session_regenerate_id();
}

global_config文件定义mysql密码,数据库,用户和主机,db_connect文件只返回mysqli_connect以连接数据库。

这就是登录功能

function login($user,$pass){
    sec_session_start();
    $link=linkit();
    if(empty($user) || empty($pass) || !isset($user) || !isset($pass)){
        echo "Error Code: 313, Please contact network administrator for more information";
        exit;
    }else{
        $usercheck = "SELECT `id`,`username`,`password`,`salt` FROM `".LOGINTABLE."` WHERE `username`=? LIMIT 1";
        if($stmt=$link->prepare($usercheck)){
            $stmt->bind_param('s',$user);
            $stmt->execute();
            $stmt->store_result();
            $stmt->bind_result($id,$username,$realpassword,$salt);
            $stmt->fetch();
            $stmt->close();

            if(empty($realpassword)){
                echo 'Unrecognized Username, Please enter a valid username';
                exit;
            }else{
                if($realpassword===$pass){
                    $_SESSION['username'] = $user;
                    $_SESSION['user_id'] = $id;
                    $_SESSION['login_string'] = hash('sha512',$pass);
                    return true;
                }else{
                    echo "Invalid Password!";
                    exit;
                }
            }
        }
    }
}

linkit()方法是db_connect.php中定义的方法,它返回mysqli_connect。另请注意,脚本成功地设置了Session变量,这意味着它确实返回true。

现在问题就是这个,当我检查登录状态时

function check_login()
{
    if(isset($_SESSION['user_id']) &&
            isset($_SESSION['login_string']) && isset($_SESSION['username']))
    {
        $user_id = $_SESSION['user_id'];
        $username = $_SESSIOOO['username'];
        $login_string = $_SESSION['login_string'];

        $pwd_check = "SELECT `password` FROM `".LOGINTABLE."` WHERE `user_id`=? LIMIT 1";
        if($stmt = linkit()->prepare($pwd_check))
        {
            $stmt->bind_param('s',$user_id);
            $stmt->execute();
            $stmt->bind_result($realpassword);
            $stmt->fetch();
            $stmt->close();
            $hashedpass = hash('sha512',$realpassword);
            if($login_string==$hashedpass){
                return true;
            }else{
                return false;
            }
        }else{
                return true;
        }
    }else{
        return false;
    }
}

最后,这是我处理登录脚本的地方。另请注意,POST方法或其他任何内容都没有错误。他们都很好。

这是在一个单独的php文件中,而在functions.php

中是 NOT
<?php 
include_once '../includes/functions.php';
if(empty($_POST['loginuser']) || !isset($_POST['loginuser']) || !isset($_POST['id']) || empty($_POST['id']) || !isset($_POST['password']) || empty($_POST['password']))
{
    echo "Error Code: 412, Please contact network administrator for more information";
    exit;
}else{
    if($_POST['loginuser']==="true")
    {   
        $user = $_POST['id'];
        $pass = $_POST['password'];
        if(login($user,$pass)==true)
        {
            echo "Logged In!";
        }else
        {
            echo "Failed to login, check your username or password";
        }
    }
}
?>

其他信息

  • 我得到的回复是&#34;登录&#34;
  • 会话成功创建

问题:当我检查登录状态时,尽管设置了会话变量,它仍会返回false。

1 个答案:

答案 0 :(得分:1)

在check_login中,您将对密码进行哈希处理,然后比较未使用的密码

function check_login()
{
    if(isset($_SESSION['user_id']) &&
            isset($_SESSION['login_string']) && isset($_SESSION['username']))
    {
        $user_id = $_SESSION['user_id'];
        $username = $_SESSIOOO['username'];
        $login_string = $_SESSION['login_string'];

        $pwd_check = "SELECT `password` FROM `".LOGINTABLE."` WHERE `user_id`=? LIMIT 1";
        if($stmt = linkit()->prepare($pwd_check))
        {
            $stmt->bind_param('s',$user_id);
            $stmt->execute();
            $stmt->bind_result($realpassword);
            $stmt->fetch();
            $stmt->close();
            $hashedpass = hash('sha512',$realpassword);
            if($login_string==$hashedpass ){
                return true;
            }else{
                return false;
            }
        }else{
                return true;
        }
    }else{
        return false;
    }
}