En comparación con Cookie, Session es una sesión almacenada en el servidor, relativamente segura, y a diferencia de Cookie, no tiene límite de longitud de almacenamiento. Este artículo presenta brevemente el uso de Session.
Dado que Session se almacena como archivos de texto en el servidor, no hay temor de que el cliente modifique el contenido de Session. De hecho, en los archivos de Session del servidor, PHP modifica automáticamente los permisos del archivo de Session, conservando solo permisos de lectura y escritura del sistema, y no se pueden modificar a través de FTP, por lo que es mucho más seguro.
Para Cookie, supongamos que queremos verificar si el usuario ha iniciado sesión; debemos guardar en Cookie el nombre de usuario y la contraseña (posiblemente una cadena cifrada con md5) y verificar en cada solicitud de página. Si el nombre de usuario y la contraseña se almacenan en la base de datos, habría que ejecutar una consulta a la base de datos cada vez, lo que supone una carga innecesaria para la base de datos. Porque no podemos hacer una sola verificación. ¿Por qué? Porque la información en la Cookie del cliente puede ser modificada. Si almacenas una variable $admin para indicar si el usuario ha iniciado sesión, cuando $admin sea true indica que ha iniciado sesión, y cuando sea false indica que no. Después de la primera verificación exitosa, guardas $admin igual a true en Cookie y la próxima vez no necesitas verificar. ¿Es correcto? Incorrecto. Si alguien falsifica una variable $admin con valor true, ¿no obtendría inmediatamente permisos de administración? Es muy inseguro.
Session es diferente: Session se almacena en el servidor, los usuarios remotos no pueden modificar el contenido del archivo de Session. Por lo tanto, podemos simplemente almacenar una variable $admin para determinar si ha iniciado sesión. Después de la primera verificación exitosa, establecemos el valor de $admin en true; luego comprobamos si ese valor es true; si no lo es, se redirige a la interfaz de inicio de sesión. Así se reducen muchas operaciones de base de datos. Además, se reduce la inseguridad de transmitir la contraseña cada vez para verificar la Cookie (la verificación de Session solo necesita transmitirse una vez, si no usas el protocolo de seguridad SSL). Incluso si la contraseña está cifrada con md5, es muy fácil de interceptar.
Por supuesto, usar Session tiene muchas ventajas, como fácil control, se puede almacenar según la personalización del usuario, etc. (almacenamiento en base de datos). No hablaré más de esto aquí.
¿Session necesita configurarse en php.ini? Generalmente no, porque no todo el mundo tiene permiso para modificar php.ini. La ruta de almacenamiento predeterminada de Session es la carpeta temporal del sistema del servidor. Podemos personalizar su almacenamiento en nuestra propia carpeta; esto lo presentaré más adelante.
Comencemos a explicar cómo crear una Session. Es muy simple, de verdad.
Iniciar la sesión de Session y crear una variable $admin:
Ejemplo
// Iniciar Session
session_start();
// Declarar una variable llamada admin y asignarle un valor vacío.
$_SESSION["admin"] = null;
?>
Si usas Session, o si este archivo PHP necesita llamar variables de Session, entonces debes iniciar Session antes de llamarla, usando la función session_start(). No necesitas configurar nada más; PHP completa automáticamente la creación del archivo de Session.
Después de ejecutar este programa, podemos ir a la carpeta temporal del sistema para encontrar este archivo de Session. Generalmente el nombre del archivo es como: sess_4c83638b3b0dbf65583181c2f89168ec, donde el sufijo es una cadena aleatoria codificada de 32 bits. Ábrelo con un editor y observa su contenido:
admin|N;
Generalmente, el contenido tiene esta estructura:
nombre de variable|tipo:longitud:valor;
Y cada variable se separa con punto y coma. Algunas cosas se pueden omitir, como la longitud y el tipo.
Veamos el programa de verificación, suponiendo que la base de datos almacena el nombre de usuario y la contraseña cifrada con md5:
Código del archivo login.php
// Después del envío del formulario...
$posts = $_POST;
// Eliminar algunos caracteres en blanco
foreach ($posts as $key => $value) {
$posts[$key] = trim($value);
}
$password = md5($posts["password"]);
$username = $posts["username"];
$query = "SELECT `username` FROM `user` WHERE `password` = '$password' AND `username` = '$username'";
// Obtener el resultado de la consulta
$userInfo = $DB->getRow($query);
if (!empty($userInfo)) {
// Cuando la verificación pasa, iniciar Session
session_start();
// Registrar la variable admin del inicio de sesión exitoso y asignarle true
$_SESSION["admin"] = true;
} else {
die(Nombre de usuario o contraseña incorrectos);
}
?>
Iniciamos Session en las páginas que requieren verificación de usuario para determinar si ha iniciado sesión:
Ejemplo
// Prevenir riesgos de seguridad causados por variables globales
$admin = false;
// Iniciar sesión, este paso es imprescindible
session_start();
// Determinar si ha iniciado sesión
if (isset($_SESSION["admin"]) && $_SESSION["admin"] === true) {
echo Ha iniciado sesión correctamente;
} else {
// Si la verificación falla, establecer $_SESSION["admin"] en false
$_SESSION["admin"] = false;
die(No tiene permiso para acceder);
}
?>
¿Es muy sencillo? Basta con considerar $_SESSION como un array almacenado en el servidor. Cada variable que registramos es una clave del array, no hay diferencia con el uso de arrays.
¿Qué hacer si queremos cerrar sesión del sistema? Simplemente destruir la Session.
Ejemplo
session_start();
// Este método destruye una variable previamente registrada
unset($_SESSION['admin']);
// Este método destruye todo el archivo de Session
session_destroy();
?>
¿Puede Session configurar un ciclo de vida como Cookie? ¿Con Session se abandona por completo Cookie? Quiero decir que combinar Cookie con Session es lo más conveniente.
¿Cómo determina Session al usuario del cliente? A través del Session ID. ¿Qué es el Session ID? Es el nombre del archivo de Session. El Session ID se genera aleatoriamente, por lo que se garantizan la unicidad y la aleatoriedad, asegurando la seguridad de Session. Generalmente, si no se configura el ciclo de vida de Session, el Session ID se almacena en la memoria. Al cerrar el navegador, el ID se cierra automáticamente. Al solicitar la página nuevamente, se registra un nuevo Session ID.
Si el cliente no tiene Cookie deshabilitada, Cookie desempeña el papel de almacenar el Session ID y el ciclo de vida de Session al iniciar la sesión de Session.
Vamos a configurar manualmente el ciclo de vida de Session:
Ejemplo
session_start();
// Guardar un día
$lifeTime = 24 * 3600;
setcookie(session_name(), session_id(), time() + $lifeTime, "/");
?>
En realidad, Session también proporciona la función session_set_cookie_params(); para configurar el ciclo de vida de Session. Esta función debe llamarse antes de la función session_start():
Ejemplo
// Guardar un día
$lifeTime = 24 * 3600;
session_set_cookie_params($lifeTime);
session_start();
$_SESSION["admin"] = true;
?>
Si el cliente usa IE 6.0, la función session_set_cookie_params(); puede tener algunos problemas al configurar Cookie, por lo que es mejor llamar manualmente a la función setcookie para crear la cookie.
¿Qué pasa si el cliente deshabilita Cookie? No hay forma; todo el ciclo de vida es el proceso del navegador. En cuanto se cierra el navegador, al volver a solicitar la página se debe registrar una nueva Session. Entonces, ¿cómo se transmite el Session ID? Se transmite a través de la URL o mediante un formulario oculto. PHP enviará automáticamente el Session ID a la URL, con una forma como: http://www.test.cn/index.php?PHPSESSID= bba5b2a240a77e5b44cfa01d49cf9669, donde el parámetro PHPSESSID en la URL es el Session ID. Podemos usar $_GET para obtener ese valor, logrando así la transferencia del Session ID entre páginas.
Ejemplo
// Guardar un día
$lifeTime = 24 * 3600;
// Obtener el nombre actual de Session, por defecto PHPSESSID
$sessionName = session_name();
// Obtener el Session ID
$sessionID = $_GET[$sessionName];
// Usar session_id() para configurar el Session ID obtenido
session_id($sessionID);
session_set_cookie_params($lifeTime);
session_start();
$_SESSION['admin'] = true;
?>
En el caso de alojamiento virtual, si las Session de todos los usuarios se guardan en la carpeta temporal del sistema, se dificulta el mantenimiento y se reduce la seguridad. Podemos configurar manualmente la ruta de guardado del archivo de Session; session_save_path() proporciona esta función. Podemos apuntar el directorio de almacenamiento de Session a una carpeta que no sea accesible mediante la web. Por supuesto, la carpeta debe tener permisos de lectura y escritura.
Ejemplo
// Establecer un directorio de almacenamiento
$savePath = './session_save_dir/';
// Guardar un día
$lifeTime = 24 * 3600;
session_save_path($savePath);
session_set_cookie_params($lifeTime);
session_start();
$_SESSION['admin'] = true;
?>
Igual que la función session_set_cookie_params();, la función session_save_path() también debe llamarse antes de la función session_start().
También podemos almacenar arrays y objetos en la sesión. Operar con arrays no es diferente de operar con variables normales, pero al guardar objetos, PHP serializa automáticamente el objeto (también llamado serialización) y luego lo guarda en la sesión. El siguiente ejemplo ilustra esto:
Código del archivo person.php
class person {
var $age;
function output() {
echo $this->age;
}
function setAge($age) {
$this->age = $age;
}
}
?>
Código del archivo setage.php
session_start();
require_once 'person.php';
$person = new person();
$person->setAge(21);
$_SESSION['person'] = $person;
echo '<a href='output.php'>check here to output age</a>';
?>
Código del archivo output.php
// Establecer la función de devolución de llamada para asegurar la reconstrucción del objeto.
ini_set('unserialize_callback_func', 'mycallback');
function mycallback($classname) {
include_once $classname . '.php';
}
session_start();
$person = $_SESSION['person'];
// Muestra 21
$person->output();
?>
Cuando ejecutamos el archivo setage.php, se llama al método setage(), se establece la edad en 21, y ese estado se serializa y se guarda en la sesión (PHP realiza automáticamente esta conversión). Cuando pasamos a output.php, para generar este valor, es necesario deserializar el objeto recién guardado. Además, dado que al deserializar se necesita instanciar una clase no definida, definimos una función de devolución de llamada que incluye automáticamente el archivo de clase person.php. De esta manera, el objeto se reconstruye, se obtiene el valor actual de age que es 21, y luego se llama al método output() para generar ese valor.
Además, también podemos usar la función session_set_save_handler para personalizar el modo de llamada de la sesión.
Dirección original: https://www.cnblogs.com/happyforev1/articles/1645916.html