如何防止php会话获取错误的值?

时间:2018-07-26 15:14:16

标签: php mysql session

我有一个php网站,有时在我加载页面时会从另一个用户那里获得$ _SESSION值,但是当我刷新页面时,一切正常。

例如,我以用户A身份登录,浏览该站点,然后在页面中从用户B获得会话。我刷新页面并再次从用户A获得正确的信息。

这是我站点中每个文件中与require_once一起使用的文件“ db.php”。我把它放在所有脚本的开头:

<?php
    if(!isset($_SESSION)){session_start();}

    $mysqli = new mysqli("localhost", "", "", "");

    if ($mysqli->connect_errno) {
        echo "Error: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
    }

    $mysqli->set_charset("utf8");

    include("functions.php");
    date_default_timezone_set('America/Mexico_City');
?>

我也使用共享主机,该主机设置了以下值:

session.gc_maxlifetime = 604800;
session.save_path = /var/cpanel/php/sessions/ea-php56;

我在每个页面中都需要一个“ header.php”,该查询具有获取并显示当前用户的用户名的功能。在这里,我注意到该会话有问题,但是我不知道为什么:

$query=sprintf("SELECT * FROM tblusers WHERE user=%s",$_SESSION['ADMINID']);
$info=$mysqli->query($query);
$c=$info->fetch_assoc();

以这种方式完成登录。 cpass()是对通行证进行加密以对数据库进行检查的函数。登录成功,在浏览后我遇到了问题:

<?php
    if(isset($_POST['user'])&&isset($_POST['pass'])){
        $user=$mysqli->real_escape_string(trim($_POST['user']));
        $pass=cpass($mysqli->real_escape_string(trim($_POST['pass'])));
        $query=sprintf("SELECT * FROM tblusers WHERE user=%s AND pass='%s'",$user,$pass);
        $check=$mysqli->query($query);
        if($check->num_rows==1){
            $r=$check->fetch_assoc();
            $_SESSION['ADMINID']=$r['userid'];
            session_regenerate_id(true);
            header("Location: /");exit;
        }
    }
?>

以这种方式处理注销:

<?php
    if(!isset($_SESSION)){session_start();}
    $_SESSION=array();
    unset($_SESSION);
    session_unset();
    session_destroy();
    if(isset($_GET['url'])){
        header("Location: ".$_GET['url']);
    }else{
        header("Location: /");
    }
?>

谢谢!

1 个答案:

答案 0 :(得分:1)

简单修复,当登录脚本有效时,您可以在其末尾提供类似的内容,以便为他们提供$SESSION和他们在数据库中的userID关联。

Login.php

//login code

.....

//
//if successful
            $_SESSION['user_id'] = $user['username'];
        $_SESSION['logged_in'] = time();

        header( "Location: /home.php" );
        die();

然后在首页顶部(我想这是您想要回显的位置,就像您以'user123'身份登录

home.php

<?php 
session_start();
if(isset($_SESSION['user_id']) || isset($_SESSION['logged in'])){ 
echo 'whatever you want here'
?>