Análisis PHP de tecnología de página web dinámica sobre cookies y sesiones.
Autor:Eve Cole
Fecha de actualización:2009-06-06 18:16:01
1. COOKIE PHP
Una cookie es un mecanismo que almacena datos en un navegador remoto para rastrear e identificar a los usuarios.
PHP envía cookies en la información del encabezado del protocolo http, por lo que se debe llamar a la función setcookie () antes de enviar otra información al navegador, lo cual es similar a la restricción en la función header ().
1.1 Configurar cookies:
Las cookies se pueden configurar utilizando las funciones setcookie() o setrawcookie(). También se puede configurar enviando encabezados http directamente al cliente.
1.1.1 Utilice la función setcookie() para configurar cookies:
bool setcookie (nombre de cadena [, valor de cadena [, int expirar [, ruta de cadena [, dominio de cadena [, bool seguro [, bool httponly]]]]]])
nombre: nombre de la variable de cookie
valor: el valor de la variable de cookie
expirar: el momento en que finaliza el período de validez,
ruta: directorio válido,
dominio: nombre de dominio válido, dominio de nivel superior único
seguro: si el valor es 1, la cookie solo es válida en conexiones https, si el valor predeterminado es 0, tanto http como https son válidos.
ejemplo:
<?php
$valor = 'algo de alguna parte';
setcookie("TestCookie", $valor /* Configuraciones de cookies simples*/
setcookie("TestCookie", $value, time()+3600 /* El período de validez es 1 hora*/);
setcookie("TestCookie", $value, time()+3600, "/~rasmus/", ".example.com", 1); /* Directorio válido/~rasmus, nombre de dominio válido example.com y todos sus subdominios); */
?>
Establezca múltiples variables de cookies: setcookie('var[a]','value'); Use una matriz para representar la variable, pero su subíndice no necesita comillas. De esta manera, puede usar $_COOKIE['var'][ 'a'] para leer la variable COOKIE.
1.1.2. Utilice el encabezado () para configurar cookies;
header("Establecer-Cookie: nombre=$valor[;ruta=$ruta[;dominio=xxx.com[;...]]");
Los siguientes parámetros son los mismos que los enumerados anteriormente para la función setcookie.
Por ejemplo:
$valor = 'algo de alguna parte';
encabezado("Establecer-Cookie:nombre=$valor");
1.2 Lectura de Cookies:
Puede utilizar directamente la variable súper global incorporada de PHP $_COOKIE para leer las cookies en el lado del navegador.
En el ejemplo anterior, la cookie "TestCookie" está configurada. Ahora leámoslo:
imprimir $_COOKIE['Cookie de prueba'];
¿Se ha exportado la COOKIE?
1.3 Eliminar cookies
Simplemente configure la hora válida para que sea menor que la hora actual y establezca el valor en vacío. Por ejemplo:
setcookie("nombre","",hora()-1);
Similar al uso del encabezado().
1.4 Resolución de problemas comunes:
1) Hay un mensaje de error al usar setcookie(). Puede deberse a que hay resultados o espacios antes de llamar a setcookie(). También puede ser que su documento se haya convertido a partir de otros conjuntos de caracteres y que el documento tenga una firma BOM. al final (es decir, agregar algunos caracteres ocultos a la lista de materiales al contenido del archivo). La solución es evitar que esta situación ocurra en su documento. También puede manejarlo un poco usando la función ob_start().
2) $_COOKIE se ve afectado por magic_quotes_gpc y se puede escapar automáticamente
3) Al utilizarlo, es necesario comprobar si el usuario admite cookies.
<!--[if !supportLineBreakNewLine]-->
1.5 Mecanismo de funcionamiento de las cookies:
Algunos alumnos son más impulsivos y no tienen tiempo para estudiar los principios, así que lo pongo más adelante.
a) El servidor configura una cookie en el cliente enviando un encabezado http Set-Cookie con la respuesta (múltiples cookies requieren múltiples encabezados).
b) El cliente envía automáticamente un encabezado de cookie http al servidor, y el servidor lo recibe y lee.
HTTP/1.x 200 correcto
X-Desarrollado por: PHP/5.2.1
Set-Cookie: TestCookie=algo de alguna parte ruta=/;
Expira: jueves, 19 de noviembre de 2007 18:52:00 GMT
Control de caché: sin almacenamiento, sin caché, debe revalidar, verificación posterior = 0, verificación previa = 0
Pragma: sin caché
Tipo de contenido: texto/html
Esta línea implementa la función de cookie después de recibir esta línea.
Set-Cookie: TestCookie=algo de alguna parte ruta=/;
El navegador creará un archivo cookie en el disco del cliente y escribirá:
TestCookie=algo de alguna parte;
/
Esta línea es el resultado de usar setcookie('TestCookie','algo de algún lugar','/');. También es el resultado de usar header('Set-Cookie: TestCookie=algo de algún lugar; ruta=/') ;.
<!--[endif]-->
2. Sesión PHP
La sesión utiliza una cookie con el tiempo de caducidad establecido en 0 y utiliza un identificador único llamado ID de sesión (una cadena larga) para sincronizar algunos archivos de sesión en el lado del servidor (puede definir el tipo de almacenamiento de la sesión usted mismo) y comunicarse con el usuario conectado. La aplicación web almacena los datos asociados con estas sesiones y permite que los datos se transmitan entre páginas con el usuario.
A los visitantes del sitio web se les asigna un identificador único, el llamado ID de sesión. Se almacena en una cookie del lado del cliente o se pasa a través de la URL.
El soporte de sesión permite a los usuarios registrar cualquier cantidad de variables y reservarlas para cada solicitud. Cuando un visitante accede al sitio web, PHP comprueba si se envió un ID de sesión específico en la solicitud, ya sea automáticamente (si session.auto_start está configurado en 1) o cuando el usuario lo solicita (llamado explícitamente por session_start() o implícitamente por session_register( )). Si es así, se recrea el entorno previamente guardado.
2.1 Transmisión de ID de sesión
2.1.1 Transmitir ID de sesión mediante cookie
Utilice session_start() para llamar a la sesión. Mientras genera el archivo de sesión, el servidor genera el valor hash de ID de sesión y el nombre de la sesión con el valor predeterminado de PHPSESSID, y envía la variable al cliente (el valor predeterminado es) PHPSESSID (nombre de sesión). ), con el valor Es un valor hash de 128 bits. El servidor interactuará con el cliente a través de esta cookie.
El valor de la variable de sesión es serializado internamente por PHP y almacenado en un archivo de texto en la máquina del servidor, e interactúa con el culi del cliente cuyo nombre de variable es PHPSESSID de forma predeterminada.
Es decir, el servidor envía automáticamente el encabezado http: header('Set-Cookie: session_name()=session_id(); path=/');
Es decir, setcookie(session_name(),session_id());
Al saltar a una nueva página desde esta página y llamar a session_start(), PHP verificará los datos de sesión almacenados en el lado del servidor asociados con la ID dada. Si no se encuentran, se creará un nuevo conjunto de datos.
2.1.2 Transmitir ID de sesión a través de URL
Este método sólo se utiliza cuando el usuario prohíbe el uso de cookies, porque las cookies del navegador ya son universales y, por razones de seguridad, este método no es necesario.
<a href="p.php?<?php print session_name() ?>=<?php print session_id() ?>">xxx</a>, el valor de la sesión también se puede pasar a través de POST.
2.2 Ejemplos de uso básico de sesión
<?php
// página1.php
inicio_sesión();
echo 'Bienvenido a la página 1';
/* Crear variables de sesión y asignar valores a las variables de sesión */
$_SESSION['favcolor'] = 'verde';
$_SESSION['animal'] = 'gato';
$_SESSION['tiempo'] = tiempo();
// Si el cliente usa cookies, la sesión se puede pasar directamente a page2.php
echo '<br /><a href="page2.php">página 2</a>';
// Si el cliente desactiva las cookies
echo '<br /><a href="página2.php?'. SID. '">página 2</a>';
/*
De forma predeterminada, en php5.2.1, el SID solo tendrá un valor cuando se escriba la cookie en la sesión.
La cookie correspondiente ya existe, entonces el SID estará (indefinido) vacío
*/
?>
<?php
// página2.php
inicio_sesión();
print $_SESSION['animal'] // Imprime una sola sesión
var_dump($_SESSION); // Imprime el valor de la sesión pasado por page1.php
?>
2.3 Utilice la función de sesión para controlar el almacenamiento en caché de la página.
En muchos casos, necesitamos determinar si nuestra página web está almacenada en caché en el cliente o establecer el tiempo de validez de la caché. Por ejemplo, hay contenido confidencial en nuestra página web y debe iniciar sesión para verlo si está almacenado en caché localmente. , puede abrir directamente el caché local. Puede navegar por la web sin iniciar sesión.
Utilice session_cache_limiter('private'); para controlar la caché del cliente de la página, que debe llamarse antes de session_start().
Para obtener más parámetros, consulte control de caché del cliente en http://blog.chinaunix.net/u/27731/showart.php?id=258087 .
Para controlar el tiempo de caché del cliente, use session_cache_expire(int) unidad(es). También debe llamarse antes de session_start().
Este es solo un método para controlar el almacenamiento en caché cuando se usa la sesión. También podemos controlar el almacenamiento en caché de la página en el encabezado ().
2.4 Eliminar sesión
Se necesitan tres pasos para lograrlo.
<?php
session_destroy(); // El primer paso: eliminar el archivo de sesión del lado del servidor, esto utiliza
setcookie(session_name(),'',time()-3600); // Paso 2: Eliminar la sesión real:
$_SESSION = array(); // Paso 3: Eliminar la matriz de variables globales $_SESSION
?>
2.5 El uso de sesiones en aplicaciones web PHP a gran escala Para sitios con una gran cantidad de visitas, el método de almacenamiento de sesiones predeterminado no es adecuado. El mejor método actual es utilizar la base de datos para acceder a la sesión. La función bool session_set_save_handler (apertura de devolución de llamada, cierre de devolución de llamada, lectura de devolución de llamada, escritura de devolución de llamada, destrucción de devolución de llamada, gc de devolución de llamada) son las soluciones que se nos brindan para resolver este problema.
Las 6 funciones utilizadas por esta función son las siguientes:
1. bool open() se utiliza para abrir el mecanismo de almacenamiento de la sesión,
2. bool close() cierra la operación de almacenamiento de la sesión.
3. mixde read() Utilice esta función al cargar datos de sesión desde el almacenamiento
4. bool write() escribe todos los datos del ID de sesión dado en el almacenamiento
5. bool destroy() destruye los datos asociados con el ID de sesión especificado
6. bool gc() Para ver un ejemplo de recolección de basura de datos en el sistema de almacenamiento, consulte la función session_set_save_handler() en el manual de PHP.
Si usa clases para manejarlo, use
session_set_save_handler(
array('nombredeclase','abierto'),
array('nombredeclase','cerrar'),
array('nombredeclase','leer'),
array('nombredeclase','escribir'),
array('nombredeclase','destruir'),
array('nombredeclase','gc'),
)
Llame a los 6 métodos estáticos en la clase className. ClassName se puede cambiar a un objeto, por lo que no es necesario llamar a métodos estáticos. Sin embargo, el uso de miembros estáticos no requiere generar un objeto y el rendimiento es mejor.
2.6 Funciones de sesión de uso común:
bool session_start(void); inicializar sesión
bool session_destroy (void): elimina los archivos asociados a la sesión del lado del servidor.
string session_id() ID de la sesión actual
string session_name() El nombre de la sesión a la que se accede actualmente, que es el nombre de la cookie donde el cliente guarda el ID de la sesión. El valor predeterminado es PHPSESSID.
array session_get_cookie_params() Detalles de la sesión asociados con esta sesión.
string session_cache_limiter() controla la caché del cliente de las páginas que utilizan la sesión
ini session_cache_expire() controla el tiempo de caché del cliente
bool session_destroy() elimina el archivo que guarda la información de la sesión en el lado del servidor
void session_set_cookie_params ( int life [, string path [, string domain [, bool Secure [, bool httponly]]]] ) Establece los detalles de la sesión asociados con esta sesión.
bool session_set_save_handler (apertura de devolución de llamada, cierre de devolución de llamada, lectura de devolución de llamada, escritura de devolución de llamada, destrucción de devolución de llamada, devolución de llamada gc) define la función para procesar la sesión (sin utilizar el método predeterminado)
bool session_regenerate_id([bool delete_old_session]) asigna una nueva identificación de sesión
2.7 Problemas de seguridad de la sesión Los atacantes se esfuerzan mucho en intentar obtener el ID de sesión efectivo de un usuario existente. Con el ID de sesión, es posible que puedan tener las mismas capacidades que este usuario en el sistema.
Por tanto, nuestra principal solución es verificar la validez del ID de sesión.
<?php
if(!isset($_SESSION['user_agent'])){
$_SESSION['user_agent'] = $_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'];
}
/* Si el ID de sesión del usuario es falso*/
elseif ($_SESSION['user_agent'] != $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']) {
sesión_regenerate_id();