PHP如何避免多会话

时间:2016-08-21 02:17:41

标签: php session

我想做一些事情,但不知道PHP SESSIONS是否可行。  1.避免多会话。 (我在我的数据库中使用了一个标志,但是当用户没有注销时问题出现了,他们就关闭了浏览器。  2.远程注销用户。

我会把我的代码放在这里。我尝试使用数据库并检查时间差异,因此我重写了数据库中的值,用户可以登录。

Sessions.php

<?php
//Evitamos que nos salgan los NOTICES de PHP
error_reporting(E_ALL ^ E_NOTICE);

//Obtenemos el timestamp del servidor de cuanto se hizo la petición
$hora = $_SERVER["REQUEST_TIME"];
require('conexion.php');


//Duración de la sesión en segundos
$duracion = 9000;
//Si el tiempo de la petición* es mayor al tiempo permitido de la duración, 
//destruye la sesión y crea una nueva




if (isset($_SESSION['ultima_actividad']) && ($hora - $_SESSION['ultima_actividad']) > $duracion) {
    session_unset();
    session_destroy();
    // session_start();
};
// * Por esto este archivo debe ser incluido en cada página que necesite comprobar las sesiones

//Definimos el valor de la sesión "ultima_actividad" como el timestamp del servidor
$_SESSION['ultima_actividad'] = $hora;
?>

access.php     

//Conectamos a la base de datos
require('../../config/conexion.php');


//Obtenemos los datos del formulario de acceso
$userPOST = $_POST["idUsuario"]; 
$passPOST = $_POST["idPass"];

//Filtro anti-XSS Seguridad
$userPOST = htmlspecialchars(mysqli_real_escape_string($conexion, $userPOST));
$passPOST = htmlspecialchars(mysqli_real_escape_string($conexion, $passPOST));

//Definimos la cantidad máxima de caracteres
//Esta comprobación se tiene en cuenta por si se llegase a modificar el "maxlength" del formulario
//Los valores deben coincidir con el tamaño máximo de la fila de la base de datos
$maxCaracteresUsername = "20";
$maxCaracteresPassword = "60";

//Si los input son de mayor tamaño, se "muere" el resto del código y muestra la respuesta correspondiente
if(strlen($userPOST) > $maxCaracteresUsername) {
    die('El nombre de usuario no puede superar los '.$maxCaracteresUsername.' caracteres');
};

if(strlen($passPOST) > $maxCaracteresPassword) {
    die('La contraseña no puede superar los '.$maxCaracteresPassword.' caracteres');
};

//Pasamos el input del usuario a minúsculas para compararlo después con
//el campo "usernamelowercase" de la base de datos
// $userPOSTMinusculas = strtolower($userPOST);

//Escribimos la consulta necesaria
// $consulta = "SELECT * FROM `users` WHERE usernamelowercase='".$userPOSTMinusculas."'";

//Consulta normal sin pedir comprobaciones de minusculas o mayusculas.
$consulta = "SELECT * FROM `users` WHERE username='".$userPOST."'";


//Obtenemos los resultados
$resultado = mysqli_query($conexion, $consulta) or die ("Query problem");
$datos = mysqli_fetch_array($resultado);

//Guardamos los resultados del nombre de usuario normal, no en minúsculas
//y de la contraseña de la base de datos
$userBD = $datos['username'];
$passwordBD = $datos['password'];

//Comprobamos si los datos son correctos
// if($userBD == $userPOSTMinusculas and password_verify($passPOST, $passwordBD)){
if($userBD == $userPOST and $passPOST == $passwordBD){
    date_default_timezone_set('America/Chihuahua');
    // die($parsedDate); //2016-08-18 22:54:33
    //CrearFuncion para la diferencia en las fechas y el accesso en si para no repetir procedimientos... 
    //Funciones o declaraciones repetidas deberan ser incluidas en esta clase*****************************************


    $time = date('Y-m-d H:i:s');
    $time_dt = new DateTime($time);
    $databasetime_dt = new DateTime($datos['lastActivity']);
    //*******************************OBTENER DIFERENCIAS EN LAS FECHAS. ENTRE EL TIEMPO ACTUAL Y LA HORA QUE SE REGISTRA EN LA BASE DE DATOS.
    $interval = $databasetime_dt->diff($time_dt);
    // die($interval->format('%Y'));

    if($datos['logged'] == 0){

    session_id($datos['id']);
    session_start();
    $_SESSION['id'] = $datos['id'];
    $_SESSION['usuario'] = $datos['username'];
    $_SESSION['estado'] = 'Autenticado';
    // ***********************************************************************************//
    //SE GENERA UN UPDATE PARA CONFIRMAR QUE EL USUARIO ESTE LOGUEADO, SI LO ESTA, NO PODRA TENER MAS DE UNA SESION ACTIVA CON UN UPDATE EN LA HORA DE ACCESO//
    $consultaActivo = "UPDATE users SET logged = 1, lastActivity ='".$time."' WHERE id=".$datos['id'];
    $resultadoActivo = mysqli_query($conexion, $consultaActivo);
    echo 'Hecho';

    }else{
        if($interval->format('%Y') >= 1){
            session_id($datos['id']);
            session_start();
            $_SESSION['id'] = $datos['id'];
            $_SESSION['usuario'] = $datos['username'];
            $_SESSION['estado'] = 'Autenticado';
            echo 'Hecho';
            // die("Uno o mas años de diferencia");
        }else{
            if($interval->format('%m') >= 1){
                session_id($datos['id']);
                session_start();
                $_SESSION['id'] = $datos['id'];
                $_SESSION['usuario'] = $datos['username'];
                $_SESSION['estado'] = 'Autenticado';
                echo 'Hecho';
                // die("Uno o mas meses de diferencia");
            }else{
                if($interval->format('%d') >= 1){
                    session_id($datos['id']);
                    session_start();
                    $_SESSION['id'] = $datos['id'];
                    $_SESSION['usuario'] = $datos['username'];
                    $_SESSION['estado'] = 'Autenticado';
                    echo 'Hecho';
                    // die("Uno o mas dias de diferencia");
                }else{
                    if($interval->format('%H') >=1){
                        session_id($datos['id']);
                        session_start();
                        $_SESSION['id'] = $datos['id'];
                        $_SESSION['usuario'] = $datos['username'];
                        $_SESSION['estado'] = 'Autenticado';
                        echo 'Hecho';
                        // die("Una o mas hora de diferencia");
                    }else{
                        if($interval->format('%i') > 10){
                            session_id($datos['id']);
                            session_start();
                            $_SESSION['id'] = $datos['id'];
                            $_SESSION['usuario'] = $datos['username'];
                            $_SESSION['estado'] = 'Autenticado';
                            echo 'Hecho';
                        }
                        else{
                            echo 'SesionActiva';
                        }
                    }
                }
            }
        }
    }

    /* Sesión iniciada, si se desea, se puede redireccionar desde el servidor */

//Si los datos no son correctos, o están vacíos, muestra un error
//Además, hay un script que vacía los campos con la clase "acceso" (formulario)
// } else if ( $userBD != $userPOSTMinusculas || $userPOST == "" || $passPOST == "" || !password_verify($passPOST, $passwordBD) ) {
} else if ( $userBD != $userPOST || $userPOST == "" || $passPOST == "" || !password_verify($passPOST, $passwordBD) ) {
    // die ('<script>$(".input-group-addon").val("");</script>');
    echo "Datos erroneos";
} else {
    die('Error');
};
?>

logout.php

<?php
//Reanudamos la sesión
session_start();

//Requerimos los datos de la conexión a la BBDD
require('../../config/conexion.php');

$consultaActivo = "UPDATE `users` SET logged=0 WHERE id=".$_SESSION['id'];
$resultadoActivo = mysqli_query($conexion, $consultaActivo);

//Des-establecemos todas las sesiones
unset($_SESSION);

//Destruimos las sesiones
session_destroy();

//Cerramos la conexión con la base de datos
mysqli_close($conexion);

//Redireccionamos a el index
header("Location: ../../");
return true;
die();
?>

0 个答案:

没有答案