Protección de ID de sesión en PHP. Sesiones en PHP Declaración de Privacidad

10.08.2022

Saludos querida comunidad.

En primer lugar, quiero agradecerles por la gran recurso útil. Más de una vez he encontrado aquí muchas ideas interesantes y consejos prácticos.

El propósito de este artículo es resaltar los inconvenientes del uso de sesiones en PHP. Por supuesto, hay documentación sobre PHP y muchos ejemplos, y este artículo no pretende ser guía completa. Está diseñado para revelar algunos de los matices del trabajo con sesiones y proteger a los desarrolladores de pérdidas de tiempo innecesarias.

El ejemplo más común de uso de sesiones es, por supuesto, la autorización del usuario. Empecemos por la implementación más básica para ir desarrollándola poco a poco a medida que surjan nuevas tareas.

(Para ahorrar espacio y tiempo, limitaremos nuestros ejemplos solo a las funciones de sesión en sí, en lugar de crear aquí una aplicación de prueba completa con una hermosa jerarquía de clases, manejo integral de errores y otras cosas buenas).

Función startSession() ( // Si la sesión ya se inició, detenga la ejecución y devuelva TRUE // (el parámetro session.auto_start en el archivo de configuración php.ini debe estar deshabilitado; el valor predeterminado) if (session_id()) return true; else return session_start(); // Nota: Antes de la versión 5.3.0, la función session_start() devolvía TRUE incluso si había un error // Si está utilizando una versión anterior a la 5.3.0, realice una verificación adicional session_id() // después de llamar a la función session_start(). destroySession() ( if (session_id()) ( // Si hay sesión activa, eliminar cookies de sesión, setcookie(session_name(), session_id(), time()-60*60*24); // y destruye la sesión session_unset(); sesión_destroy(); ) )

Nota: Se da a entender que conocimiento básico El lector conoce las sesiones PHP, por lo que no cubriremos aquí el principio operativo de las funciones session_start() y session_destroy(). Las tareas de diseño del formulario de inicio de sesión y autenticación de usuario no están relacionadas con el tema del artículo, por lo que también las omitiremos. Permítanme recordarles que para identificar al usuario en cada solicitud posterior, en el momento de iniciar sesión exitosamente, necesitamos almacenar el identificador del usuario en una variable de sesión (llamada ID de usuario, por ejemplo), que estará disponible en todas las solicitudes posteriores dentro la vida de la sesión. También es necesario implementar el procesamiento del resultado de nuestra función startSession(). Si la función devuelve FALSO, muestra el formulario de inicio de sesión en el navegador. Si la función devolvió VERDADERO y existe una variable de sesión que contiene el identificador del usuario autorizado (en nuestro caso, ID de usuario), muestre la página del usuario autorizado (para obtener más información sobre el manejo de errores, consulte la adición con fecha 2013-06- 07 en el apartado de variables de sesión).

Hasta ahora todo ESTÁ CLARO. Las preguntas comienzan cuando es necesario implementar el control de inactividad del usuario (tiempo de espera de la sesión), permitir que varios usuarios trabajen simultáneamente en un navegador y también proteger las sesiones contra el uso no autorizado. Esto será discutido abajo.

Monitorear la inactividad del usuario usando herramientas PHP integradas

La primera duda que suele surgir entre los desarrolladores de todo tipo de consolas para los usuarios es la finalización automática de la sesión en caso de inactividad por parte del usuario. No hay nada más fácil que hacer esto utilizando las capacidades integradas de PHP. (Esta opción no es particularmente confiable ni flexible, pero la consideraremos para que esté completa).

Función startSession() ( // Tiempo de espera de inactividad del usuario (en segundos) $sessionLifetime = 300; if (session_id()) return true; // Establece la duración de la cookie ini_set("session.cookie_lifetime", $sessionLifetime); // Si el usuario Se establece el tiempo de espera de inactividad, establezca la duración de la sesión en el servidor // Nota: Para un servidor de producción, se recomienda preestablecer estos parámetros en el archivo php.ini if ​​($sessionLifetime) ini_set("session.gc_maxlifetime", $sessionLifetime if (session_start(); )) ( setcookie(session_name(), session_id(), time()+$sessionLifetime); devuelve verdadero; ) en caso contrario, devuelve falso)

Algunas aclaraciones. Como sabes, PHP determina qué sesión debe iniciarse mediante el nombre de la cookie enviada por el navegador en el encabezado de la solicitud. El navegador, a su vez, recibe esta cookie del servidor, donde la coloca la función session_start(). Si la cookie del navegador ha caducado, no se enviará en la solicitud, lo que significa que PHP no podrá determinar qué sesión iniciar y lo tratará como si estuviera creando una nueva sesión. El parámetro de configuración de PHP session.gc_maxlifetime, que se establece igual al tiempo de espera de inactividad de nuestro usuario, establece la vida útil de una sesión de PHP y está controlado por el servidor. El control de la duración de la sesión funciona de la siguiente manera (aquí consideramos un ejemplo de almacenamiento de sesiones en archivos temporales como la opción más común y predeterminada en PHP).

Cuando se crea una nueva sesión, se crea un archivo llamado sess_ en el directorio establecido como directorio de almacenamiento de la sesión en el parámetro de configuración de PHP session.save_path , Dónde - identificador de sesión. A continuación, en cada solicitud, al momento de iniciar una sesión ya existente, PHP actualiza la hora de modificación de este archivo. Así, en cada siguiente solicitud PHP, por la diferencia entre la hora actual y la hora de la última modificación del archivo de sesión, puede determinar si la sesión está activa o si su vida útil ya ha expirado. (El mecanismo para eliminar archivos de sesión antiguos se analiza con más detalle en la siguiente sección).

Nota: Cabe señalar aquí que el parámetro session.gc_maxlifetime se aplica a todas las sesiones dentro de un servidor (más precisamente, dentro de un proceso PHP principal). En la práctica, esto significa que si se ejecutan varios sitios en el servidor y cada uno de ellos tiene su propio tiempo de espera de inactividad del usuario, configurar este parámetro en uno de los sitios conducirá a su configuración para otros sitios. Lo mismo se aplica al hosting compartido. Para evitar esta situación, se utilizan directorios de sesión separados para cada sitio dentro del mismo servidor. La configuración de la ruta al directorio de sesiones se realiza utilizando el parámetro session.save_path en el archivo de configuración php.ini o llamando a la función ini_set(). Después de esto, las sesiones de cada sitio se almacenarán en directorios separados y el parámetro session.gc_maxlifetime establecido en uno de los sitios solo será válido para su sesión. No consideraremos este caso en detalle, especialmente porque tenemos una opción más flexible para monitorear la inactividad del usuario.

Controlar la inactividad del usuario mediante variables de sesión

Parecería que la opción anterior, a pesar de su sencillez (solo un par de líneas de código adicionales), ofrece todo lo que necesitamos. Pero ¿qué pasa si no todas las solicitudes pueden considerarse como resultado de la actividad del usuario? Por ejemplo, una página tiene un temporizador que periódicamente realiza una solicitud AJAX para recibir actualizaciones del servidor. Tal solicitud no puede considerarse como actividad del usuario, lo que significa que extender automáticamente la duración de la sesión no es correcto en este caso. Pero sabemos que PHP actualiza la hora de modificación del archivo de sesión automáticamente cada vez que se llama a la función session_start(), lo que significa que cualquier solicitud dará lugar a una extensión de la vida útil de la sesión y el tiempo de espera de inactividad del usuario nunca ocurrirá. Además, la última nota de la sección anterior sobre las complejidades del parámetro session.gc_maxlifetime puede parecer demasiado confusa y difícil de implementar para algunos.

Para resolver este problema, abandonaremos el uso de mecanismos PHP integrados e introduciremos varias variables de sesión nuevas que nos permitirán controlar nosotros mismos el tiempo de inactividad del usuario.

Función startSession($isUserActivity=true) ( ​​​​$sessionLifetime = 300; if (session_id()) return true; // Establece la duración de la cookie antes de cerrar el navegador (controlaremos todo en el lado del servidor) ini_set("session. cookie_lifetime", 0) ; if (! session_start()) return false; $t = time(); if ($sessionLifetime) ( // Si el tiempo de espera de inactividad del usuario está configurado, // verifica el tiempo transcurrido desde la última actividad del usuario // (hora de la última solicitud) cuando se actualizó la variable de sesión de última actividad) if (isset($_SESSION["lastactivity"]) && $t-$_SESSION["lastactivity"] >= $sessionLifetime) ( // Si la el tiempo transcurrido desde la última actividad del usuario, // es mayor que el tiempo de espera de inactividad, lo que significa que la sesión ha expirado y es necesario finalizarla destroySession(); else ( // Si el tiempo de espera aún no ha transcurrido, // y si la solicitud surgió como resultado de la actividad del usuario, // actualiza la variable lastactivity con el valor de la hora actual, // extendiendo así el tiempo de la sesión en otros segundos de sessionLifetime if ($isUserActivity) $_SESSION["lastactivity"] = $t; ) ) devuelve verdadero; )

Resumamos. En cada solicitud comprobamos si se ha alcanzado el tiempo de espera desde la última actividad del usuario hasta el momento actual, y si se ha alcanzado destruimos la sesión e interrumpimos la ejecución de la función, devolviendo FALSE. Si no se ha alcanzado el tiempo de espera y se pasa el parámetro $isUserActivity con el valor TRUE a la función, actualizamos la hora de la última actividad del usuario. Todo lo que tenemos que hacer es determinar en el script de llamada si la solicitud es el resultado de la actividad del usuario y, en caso contrario, llamar a la función startSession con el parámetro $isUserActivity establecido en FALSE.

Actualización del 2013-06-07
Procesando el resultado de la función sessionStart()

Los comentarios señalaron que devolver FALSE no proporciona una comprensión completa de la causa del error, y esto es absolutamente justo. No publiqué aquí el manejo detallado de errores (la extensión del artículo ya es bastante larga), ya que no está directamente relacionado con el tema del artículo. Pero dados los comentarios, lo aclararé.

Como puede ver, la función sessionStart puede devolver FALSO en dos casos. O la sesión no se pudo iniciar debido a algunos errores internos del servidor (por ejemplo, configuración de sesión incorrecta en php.ini) o la vida útil de la sesión expiró. En el primer caso debemos redirigir al usuario a una página con un error indicando que hay problemas en el servidor y un formulario para contactar con soporte. En el segundo caso, debemos transferir al usuario al formulario de inicio de sesión y mostrar en él el mensaje correspondiente indicando que la sesión ha caducado. Para hacer esto, necesitamos ingresar códigos de error y devolver el código correspondiente en lugar de FALSO, y en el método de llamada, verificarlo y actuar en consecuencia.

Ahora, incluso si todavía existe una sesión en el servidor, se destruirá la primera vez que se acceda a ella si el tiempo de espera de inactividad del usuario ha expirado. Y esto sucederá independientemente de la duración de la sesión establecida en la configuración global de PHP.

Nota:¿Qué sucede si se cierra el navegador y la cookie del nombre de la sesión se destruye automáticamente? La solicitud al servidor la próxima vez que se abra el navegador no contendrá las cookies de sesión y el servidor no podrá abrir la sesión y comprobar el tiempo de espera de inactividad del usuario. Para nosotros, esto equivale a crear una nueva sesión y no afecta la funcionalidad ni la seguridad de ninguna manera. Pero surge una pregunta justa: ¿quién destruirá la sesión anterior, si hasta ahora la hemos destruido después de que expirara el tiempo de espera? ¿O ahora quedará colgado en el directorio de sesiones para siempre? Para limpiar sesiones antiguas en PHP, existe un mecanismo llamado recolección de basura. Se ejecuta en el momento de la siguiente solicitud al servidor y borra todas las sesiones antiguas según la fecha de la última modificación de los archivos de sesión. Pero el mecanismo de recolección de basura no comienza con cada solicitud al servidor. La frecuencia (o más bien, la probabilidad) de inicio está determinada por dos parámetros de configuración session.gc_probability y session.gc_divisor. El resultado de dividir el primer parámetro por el segundo es la probabilidad de iniciar el mecanismo de recolección de basura. Por lo tanto, para que el mecanismo de limpieza de sesiones se inicie con cada solicitud al servidor, estos parámetros deben establecerse en valores iguales, por ejemplo "1". Este enfoque garantiza un directorio de sesión limpio, pero obviamente es demasiado costoso para el servidor. Por lo tanto, en los sistemas de producción, el valor predeterminado de session.gc_divisor se establece en 1000, lo que significa que el mecanismo de recolección de basura se ejecutará con una probabilidad de 1/1000. Si experimenta con estas configuraciones en su archivo php.ini, puede notar que en el caso descrito anteriormente, cuando el navegador cierra y borra todas sus cookies, todavía quedan sesiones antiguas en el directorio de sesiones por un tiempo. Pero esto no debería preocuparte, porque... Como ya hemos dicho, esto no afecta en modo alguno a la seguridad de nuestro mecanismo.

Actualización del 2013-06-07

Evitar que los scripts se congelen debido al bloqueo del archivo de sesión

En los comentarios se planteó el problema de que los scripts que se ejecutan simultáneamente se congelan debido al bloqueo del archivo de sesión (la opción más llamativa es la encuesta larga).

Para empezar, observo que este problema no depende directamente de la carga del servidor ni de la cantidad de usuarios. Por supuesto que más solicitudes, más lento se ejecutan los scripts. Pero esta es una dependencia indirecta. El problema aparece solo dentro de una sesión, cuando el servidor recibe varias solicitudes en nombre de un usuario (por ejemplo, una de ellas es una encuesta larga y el resto son solicitudes regulares). Cada solicitud intenta acceder al mismo archivo de sesión y, si la solicitud anterior no desbloqueó el archivo, la siguiente se quedará esperando.

Para mantener el bloqueo del archivo de sesión al mínimo, se recomienda cerrar la sesión llamando a la función session_write_close() inmediatamente después de que se hayan completado todas las acciones con variables de sesión. En la práctica, esto significa que no debes almacenar todo en variables de sesión y acceder a ellas durante la ejecución del script. Y si necesita almacenar algunos datos de trabajo en variables de sesión, léalos inmediatamente cuando comience la sesión, guárdelos en variables locales para su uso posterior y cierre la sesión (es decir, cierre la sesión usando la función session_write_close y no destruyéndola usando session_destroy ).

En nuestro ejemplo, esto significa que inmediatamente después de abrir una sesión, comprobar su vida útil y la existencia de un usuario autorizado, debemos leer y guardar todos los datos adicionales. requerido por la aplicación variables de sesión (si existen), luego cierre la sesión usando una llamada a session_write_close() y continúe ejecutando el script, ya sea una encuesta larga o una solicitud regular.

Proteger las sesiones del uso no autorizado

Imaginemos la situación. Uno de sus usuarios recibe un troyano que roba las cookies del navegador (en las que se almacena nuestra sesión) y las envía al correo electrónico especificado. El atacante obtiene la cookie y la utiliza para falsificar una solicitud en nombre de nuestro usuario autorizado. El servidor acepta y procesa con éxito esta solicitud como si viniera de un usuario autorizado. Si no se implementa una verificación adicional de la dirección IP, dicho ataque conducirá a un pirateo exitoso de la cuenta del usuario con todas las consecuencias consiguientes.

¿Por qué fue esto posible? Obviamente, porque el nombre y el identificador de sesión son siempre los mismos durante toda la vida de la sesión, y si recibe estos datos, puede enviar fácilmente solicitudes en nombre de otro usuario (por supuesto, durante la vida de esta sesión). Puede que este no sea el tipo de ataque más común, pero en teoría parece bastante factible, especialmente considerando que un troyano de este tipo ni siquiera necesita derechos de administrador para robar las cookies del navegador del usuario.

¿Cómo puedes protegerte de ataques de este tipo? Nuevamente, obviamente, limitando la vida útil del identificador de sesión y cambiando periódicamente el identificador dentro de la misma sesión. También podemos cambiar el nombre de la sesión eliminando por completo la anterior y creando una nueva sesión, copiando en ella todas las variables de sesión de la anterior. Pero esto no afecta la esencia del enfoque, por lo que por simplicidad nos limitaremos únicamente al identificador de sesión.

Está claro que cuanto más corta sea la vida útil del ID de sesión, menos tiempo tendrá un atacante para obtener y utilizar cookies para falsificar una solicitud de usuario. Lo ideal sería utilizar un nuevo identificador para cada solicitud, lo que minimizará la posibilidad de utilizar la sesión de otra persona. Pero consideraremos el caso general en el que el tiempo de regeneración del identificador de sesión se establece de forma arbitraria.

(Omitiremos la parte del código que ya se ha comentado).

Función startSession($isUserActivity=true) ( ​​// Vida útil del identificador de sesión $idLifetime = 60; ... if ($idLifetime) ( // Si la vida útil del identificador de sesión está configurada, // verifique el tiempo transcurrido desde que se inició la sesión creado o la última regeneración // (hora de la última solicitud cuando se actualizó la variable de sesión hora de inicio) if (isset($_SESSION["starttime"])) (if ($t-$_SESSION["starttime"] >= $ idLifetime) ( // Hora en que la vida del identificador de sesión ha expirado // Genera un nuevo identificador session_regenerate_id(true); $_SESSION["starttime"] = $t) ) else ( // Llegamos aquí si la sesión acaba de crearse // Establezca el tiempo de generación del identificador de sesión en tiempo actual$_SESSION["hora de inicio"] = $t; ) ) devuelve verdadero; )

Entonces, al crear una nueva sesión (que ocurre cuando el usuario inicia sesión exitosamente), configuramos la variable de sesión starttime, que almacena la hora de la última generación del identificador de sesión, en un valor igual a la hora actual del servidor. A continuación, en cada solicitud comprobamos si ha pasado suficiente tiempo (idLifetime) desde la última generación del identificador y, en caso afirmativo, generamos uno nuevo. Por lo tanto, si durante la vida útil establecida del identificador el atacante que recibió la cookie del usuario autorizado no tiene tiempo para usarla, el servidor considerará la solicitud falsa como no autorizada y el atacante será llevado a la página de inicio de sesión. .

Nota: La nueva ID de sesión ingresa a la cookie del navegador cuando se llama a la función session_regenerate_id(), que envía la nueva cookie, similar a la función session_start(), por lo que no necesitamos actualizar la cookie nosotros mismos.

Si queremos que nuestras sesiones sean lo más seguras posible, basta con establecer la vida útil del identificador en uno o incluso eliminar la función session_regenerate_id() entre paréntesis y eliminar todas las comprobaciones, lo que conducirá a la regeneración del identificador en cada pedido. (No he probado el impacto de este enfoque en el rendimiento, y solo puedo decir que la función session_regenerate_id(true) esencialmente realiza solo 4 acciones: generar un nuevo identificador, crear un encabezado con la cookie de sesión, eliminar el anterior y crear un nuevo archivo de sesión).

Digresión lírica: Si el troyano resulta ser tan inteligente que no envía cookies al atacante, sino que organiza el envío de una solicitud falsa previamente preparada inmediatamente después de recibir la cookie, lo más probable es que el método descrito anteriormente no pueda proteger contra tales un ataque, porque entre el momento en que el troyano recibe la cookie y el envío de la solicitud falsa prácticamente no habrá diferencia, y existe una alta probabilidad de que en ese momento no se regenere el identificador de sesión.

Posibilidad de trabajo simultáneo en un navegador por parte de varios usuarios.

La última tarea que me gustaría considerar es la posibilidad de que varios usuarios trabajen simultáneamente en un navegador. Esta función es especialmente útil en la etapa de prueba, cuando es necesario emular el trabajo simultáneo de los usuarios, y es recomendable hacerlo en su navegador favorito, en lugar de utilizar todo el arsenal disponible o abrir varias instancias del navegador en modo incógnito. .

En nuestros ejemplos anteriores, no especificamos explícitamente un nombre de sesión, por lo que se utilizó el nombre PHP predeterminado (PHPSESSID). Esto significa que todas las sesiones que hemos creado hasta ahora han enviado una cookie al navegador con el nombre PHPSESSID. Evidentemente, si el nombre de la cookie es siempre el mismo, entonces no hay forma de organizar dos sesiones con el mismo nombre dentro del mismo navegador. Pero si usáramos nuestro propio nombre de sesión para cada usuario, el problema se solucionaría. Hagámoslo.

Función startSession($isUserActivity=true, $prefix=null) ( ... if (session_id()) return true; // Si el prefijo de usuario se pasa en los parámetros, // establece un nombre de sesión único que incluya esto prefijo, // de lo contrario establece un nombre común para todos los usuarios (por ejemplo, MIPROYECTO) session_name("MYPROJECT".($prefix ? "_".$prefix: "")); ini_set("session.cookie_lifetime", 0); si (! session_start()) devuelve falso;

Ahora todo lo que queda es asegurarse de que el script de llamada pase un prefijo único para cada usuario a la función startSession(). Esto se puede hacer, por ejemplo, pasando un prefijo en los parámetros GET/POST de cada solicitud o mediante una cookie adicional.

Conclusión

En conclusión, proporcionaré el código final completo de nuestras funciones para trabajar con sesiones PHP, incluidas todas las tareas discutidas anteriormente.

Función startSession($isUserActivity=true, $prefix=null) ( $sessionLifetime = 300; $idLifetime = 60; if (session_id()) devuelve verdadero; session_name("MYPROJECT".($prefix ? "_".$prefix: "")); ini_set("session.cookie_lifetime", 0); if (! session_start()) devuelve falso; $t = time(); if ($sessionLifetime) ( if ($_SESSION["lastactivity"] ) && $t-$_SESSION["lastactivity"] >= $sessionLifetime) ( destroySession(); return false; ) else ( if ($isUserActivity) $_SESSION["lastactivity"] = $t; ) ) if ($idLifetime ) ( if (isset($_SESSION["starttime"])) ( if ($t-$_SESSION["starttime"] >= $idLifetime) ( session_regenerate_id(true); $_SESSION["starttime"] = $t; ) ) else ( $_SESSION["starttime"] = $t; ) ) devuelve verdadero; función destroySession() ( if (session_id()) ( session_unset(); setcookie(session_name(), session_id(), time() -60* 60*24); sesión_destroy();

Espero que este artículo ahorre algo de tiempo para aquellos que nunca han profundizado demasiado en el mecanismo de sesión y brinde suficiente información sobre este mecanismo para aquellos que recién están comenzando a familiarizarse con PHP.

7.7K

Mediante el uso Sesiones PHP el servidor te identifica y te permite realizar las operaciones necesarias: cambiar información en varias páginas web, añadir nueva información, etc. Después de terminar de trabajar en el sitio, elimina la sesión actual haciendo clic en el botón "Cerrar sesión":

¿Qué es una sesión PHP?

Una sesión PHP es una forma de almacenar información en variables de sesión que se pueden usar para la autenticación en múltiples páginas web. A diferencia de las cookies, la información de la sesión no se almacena en el ordenador del usuario. En cambio, la sesión crea un archivo en el servidor en un directorio temporal.

Esta información, almacenada durante toda la sesión, está disponible para todas las páginas web del recurso. En el servidor, la ubicación del archivo temporal está determinada por el parámetro session.save_path en el archivo de configuración php.ini.

Al crear una sesión PHP, se realizan los siguientes tres pasos:

  • Cuando se crea una sesión, PHP genera un identificador único, que es una cadena aleatoria de 32 números hexadecimales. El ID de duración de la sesión PHP se parece a esto: 9c8foj87c3jj973actop1re472e8774;
  • El servidor envía una cookie llamada PHPSESSID a la computadora del usuario para almacenar una cadena de identificación de sesión única;
  • El servidor genera un archivo en el directorio temporal especificado que contiene el nombre del identificador de sesión único con el prefijo sesión_g. sess_9c8foj87c3jj973actop1re472e8774.

Estas configuraciones ayudan al script PHP a recuperar los valores de las variables de sesión del archivo. Del lado del cliente, PHPSESSID contiene el identificador de sesión. Confirma el nombre del archivo que se buscará en un directorio específico del lado del servidor, del cual se pueden extraer las variables de sesión y utilizarlas para la verificación.

El usuario puede finalizar la sesión haciendo clic en el botón de cerrar sesión, que llama a la función session_destroy(). Cuando el usuario cierra el navegador, la sesión PHP se cierra automáticamente. De lo contrario, el servidor finalizará la sesión después del período de tiempo especificado.

Sintaxis de sesión en PHP

Cuando PHP autoriza a través de una sesión, se crea usando la función session_start() y se elimina usando la función session_destroy(). Global variable PHP, conocido como $_SESSION, se utiliza para establecer los valores de las variables de sesión. Puede restablecer todos los valores establecidos para las variables de sesión utilizando la función session_unset().

Operaciones de sesión

Veremos las siguientes operaciones usando una sesión PHP, así como ejemplos de ellas.

  • Iniciar una sesión PHP y configurar sus variables de sesión: Se inicia una nueva sesión PHP utilizando la función session_start(). Una vez que se ha creado una sesión, sus variables de sesión se pueden configurar usando $_SESSION. Hemos establecido los valores para las variables “ ID de usuario” — “usuario_php" Y " contraseña” — “tutoriales”:

Sesiones PHP - creación ¡Se ha iniciado una sesión PHP y se han configurado las variables de sesión!"; ?>

Resultado: ejecutar el código PHP anterior en el servidor producirá el siguiente mensaje:

  • Obtener valores de variables de sesión PHP: Es posible obtener los valores de las variables que configuramos durante la última sesión de inicio de sesión de PHP. Cuando abrimos una sesión PHP al principio de cada página ( inicio_sesión()), se debe especificar el siguiente código. Recuperamos y mostramos estos valores usando la variable global $_SESSION:

Sesión PHP: obtención de valores
"; echo "Contraseña - " . $_SESSION["contraseña"] . "."; ?>

Resultado: cuando ejecutamos el código PHP anterior en el servidor, obtendremos el siguiente mensaje como resultado. Se muestran los valores de las variables de sesión que configuramos anteriormente después de crear la sesión PHP.

  • Actualización de valores de variables de sesión PHP: Durante una sesión, puedes actualizar los valores de sus variables. Primero necesitamos abrir una sesión PHP al principio de cada página ( inicio_sesión()). En el siguiente código, actualizamos los valores de las variables “ ID de usuario” — “nuevo_php_usuario" Y " contraseña” — “educación”.

Puede imprimir una matriz de variables de sesión y sus valores usando la función print_r($ _SESSION), como se muestra a continuación:

Sesión PHP: cambiar valores
"; print_r($_SESSION); ?>

Resultado: cuando ejecutamos el código PHP anterior en el servidor, recibiremos el siguiente mensaje. Contendrá una serie de variables de sesión con sus nuevos valores.

¿Necesitas un nombre de usuario y contraseña?

Para enviar artículos en línea y verificar el estado de los artículos enviados, debe registrarse e iniciar sesión en su cuenta.

Lista de verificación para preparar un artículo para su envío

Como parte del proceso de envío de artículos, los autores deben verificar que su artículo cumpla con todos los siguientes puntos; los artículos podrán ser devueltos a los autores si no cumplen con estos requisitos.

    El artículo ha sido preparado de acuerdo con los requisitos.

Condiciones de transferencia de derechos de autor.

Los autores conservan los derechos de autor del trabajo y otorgan a la revista los derechos de primera publicación junto con el trabajo, mientras lo otorgan bajo los términos de la Licencia de Atribución Creative Commons, que permite a otros redistribuirlo. este trabajo con indicación obligatoria de la autoría de este trabajo y enlace a la publicación original en esta revista.

Declaracion de privacidad

Nombres y direcciones Correo electrónico, ingresado en el sitio web de esta revista se utilizará únicamente para los fines designados por esta revista y no se utilizará para ningún otro propósito ni se proporcionará a otras personas u organizaciones.

Antes de registrarse en el sistema, el usuario acepta la política de tratamiento y almacenamiento de datos personales.

Pagos de autor

1500 caracteres con espacios: 300,00 (RUB)

Publicación de 1 página de manuscrito (1500 caracteres) - 300 rublos. Los materiales gráficos / tablas se pagan por separado: 50 rublos / 1 pieza. La copia del autor, incluido el envío dentro de Rusia, se paga a petición del autor: 400 rublos. Envío al extranjero: 800 rublos. El costo de enviar un certificado de aceptación del material para publicación es de 150 rublos.

Traducción de la información adjunta (nombre completo, lugar de trabajo de los autores; título; resumen; palabras clave) en idioma en Inglés 0,5 rublos por cada carácter, incluidos los espacios.

¡Atención! Los autores (candidatos y doctores en ciencias) que, según elibrary.ru, tienen 300 o más citas (la proporción de autocitas no debe ser más del 30%) se publican de forma gratuita. Si es elegible para la publicación gratuita, al enviar material, en el campo de comentarios, indique un enlace a su perfil de biblioteca con el número de citas. Los gastos de envío de la colección se pagan por separado.

Las sesiones en PHP son un mecanismo para almacenar información sobre la computadora del cliente en el lado del servidor. De hecho, las sesiones en PHP no son un tema tan complejo, pero para entenderlo es necesario saber cómo funcionan las cookies en PHP. Entonces, si no sabes cómo funcionan las cookies en PHP, lee primero el artículo correspondiente y luego regresa aquí.

La palabra sesión se traduce del inglés como sesión, por lo que el significado mismo de sesiones en PHP se vuelve más claro, pero los programadores han adoptado el término "sesiones" y lo usaremos en este artículo.

Las sesiones en PHP son muy similares al mecanismo de cookies, los mismos pares clave => valor, solo que se almacenan en el lado del servidor.

función session_start()

Necesitamos iniciar la sesión, para ello existe la función session_start(). Esta función inicia una sesión, o sesión, como quieras llamarla.

Es recomendable llamar a la función session_start() al principio de la página, pero en mis ejemplos no hago esto.

matriz $_SESSION

Las sesiones son grupos de variables que se almacenan en el servidor pero que se refieren a un visitante único. De nuevo, este es el punto clave: Las sesiones se almacenan en el servidor..

Para asegurar la interacción de cada visitante con sus datos de su sesión, utilizamos Galleta, el comando para crear que PHP proporciona solo, no necesitas preocuparte por eso. Esta cookie sólo es relevante para el servidor y no se puede utilizar para obtener datos del usuario.

En el servidor, los datos de la sesión se almacenan en un archivo de texto y están disponibles en el programa PHP en la matriz $_SESSION. Para guardar una variable en una sesión, debe asignarle un valor en esta matriz.

Finalmente comencemos a usar ejemplos. Todo es muy sencillo.

Sesiones en PHP significado."; ?>

Ahora intentemos obtener el valor de la matriz $_SESSION en otro ejemplo.

Sesiones en PHP

Tenga en cuenta que si en el segundo ejemplo eliminamos la función session_start() entonces no tendremos acceso a los datos en la matriz $_SESSION.

función session_id()

Una vez que se crea una sesión, automáticamente tiene acceso al identificador único de la sesión usando la función session_id(). Esta función le permite configurar y obtener el valor de ID de sesión.

Sesiones en PHP

Puede buscar en la barra de herramientas de desarrollador de su navegador (en Chrome, presione Ctrl + Shift + I, luego Recursos, y encontrará una cookie allí), este dominio ha configurado una cookie para su navegador con el nombre PHPSESSID y aproximadamente lo siguiente valor: “7g5df9rkd1hhvr33lq1k6c72p7”.

Es por el valor PHPSESSID que el servidor determinará su navegador y trabajará con el conjunto correspondiente de variables que estarán disponibles para el script a través de la matriz $_SESSION, como se escribió anteriormente.

función nombre_sesión()

Mientras que la función session_id() le permite obtener el valor de ID de la sesión, la función session_name() le permite obtener el nombre de la sesión.

Sesiones en PHP

Una vez más sobre la función session_start()

Ahora sabemos más sobre cómo funcionan las sesiones en PHP y necesitamos volver a la función session_start() una vez más. Esta función inicializa el mecanismo de sesión para el usuario actual. ¿Cómo sucede esto exactamente?

  • Si el usuario inició el sitio por primera vez, entonces session_start() establece una cookie en el cliente y crea un almacenamiento temporal en el servidor asociado con la ID del usuario.
  • Especifica la tienda asociada con el ID actual pasado.
  • Si hay datos almacenados en el servidor, se colocan en la matriz $_SESSION.
  • Si Register_globals del archivo php.ini está activado, entonces todos los elementos de la matriz $_SESSION se convierten en variables globales.

Ejemplo de uso de sesión

Ahora veremos un ejemplo que nos permitirá realizar pequeños experimentos con sesiones.

Sesiones en PHP

Encimera

Has abierto una página en la sesión actual.una vez.

Abra el ejemplo en ">esta pestaña.

Todo el trabajo de la sesión se basa en la matriz $_SESSION, esto es claramente visible en este ejemplo.

Si cierras la ventana del navegador, la sesión finalizará y nuestro contador se pondrá a cero. Este comportamiento de las sesiones en PHP se puede cambiar; volveremos a este tema un poco más adelante en el artículo.

Terminar una sesión

Para finalizar la sesión necesitamos:

  1. Borre la matriz $_SESSION.
  2. Eliminar el almacenamiento temporal en el servidor.
  3. Eliminar cookies de sesión.

Puede borrar la matriz $_SESSION usando la función session_unset().

La función session_destroy() elimina el almacenamiento temporal en el servidor. Por cierto, ella no hace nada más.

Debe eliminar una cookie de sesión usando la función setcookie(), que aprendimos en la lección sobre cómo trabajar con cookies en PHP.

Ejemplo de finalizar una sesión:

Terminar una sesión

La sesión ha terminado.

Ahora puede realizar un experimento: ejecute un ejemplo con un contador en una ventana, aumente el contador y luego ejecute el ejemplo eliminando la sesión y actualice la página con el contador nuevamente.

Puede eliminar un archivo de cookies como este:

setcookie(nombre_sesión(), "", tiempo() - 60*60*24*32, "/")

Una vez más sobre las funciones session_name() y session_id()

Las funciones session_name() y session_id() rara vez se utilizan en la práctica, pero escribo sobre ellas porque el artículo necesita revelar el mecanismo mismo de cómo funcionan las sesiones en PHP.

Puede utilizar estas funciones para definir sus propios nombres e ID de sesión, pero no se recomienda. Si desea configurarlas, escriba estas funciones con argumentos antes de la función session_start(), como en el siguiente ejemplo:

Sesiones en PHP

Con este ejemplo, a todos los usuarios se les asignará el mismo ID de sesión.

Echemos un vistazo más de cerca: si ejecuta el ejemplo de la sección sobre la función session_name() (aquí está el enlace) en diferentes navegadores (por ejemplo, Chrome e Internet Explorer), cada navegador tendrá su propio identificador de sesión único. . Los navegadores almacenan cookies cada uno en su propia carpeta, por lo que la función session_start() permitirá que cada navegador cree su propio identificador único y, en consecuencia, se creará un almacenamiento único para cada navegador en el servidor. Por lo tanto, el ejemplo del contador (este) funcionará de forma independiente en cada navegador.

Si configura el mismo ID de sesión para todos los usuarios, trabajarán con el mismo almacenamiento en el servidor. A continuación se muestra un ejemplo de un contador que contará las visitas de diferentes navegadores:

100) ( session_unset(); session_destroy(); )?> Sesiones en PHP

Mostrador nº 2

Abrió la página en diferentes navegadores.una vez.

Abra el ejemplo en ">esta pestaña.

Si ejecuta este ejemplo, no es un hecho que verá uno allí. Es posible que otros visitantes ya hayan cambiado los valores en el almacén de sesiones del servidor. En este caso, no sé cuándo el servidor elimina el almacenamiento, por lo que si el contador supera 100, finalizaré la sesión.

Configurar el tiempo de espera

De forma predeterminada, la sesión "vive" hasta que el visitante cierra la ventana del navegador. Esto se debe al hecho de que la función session_start() coloca dicha cookie en el cliente.

La duración de la sesión se puede cambiar usando la función session_set_cookie_params(), aquí está su sintaxis.

session_set_cookie_params (int duración [, ruta de cadena [, dominio de cadena [, bool seguro]]])

En la práctica, es suficiente usar solo el primer parámetro (vida útil), aquí se anota el tiempo en segundos, que determina cuánto tiempo debe recordar el servidor el estado de la sesión después de cerrar el navegador.

El efecto de la función session_set_cookie_params() se aplica solo al período en que se ejecuta el script.

A continuación se muestra un ejemplo del uso de esta función:

Sesiones en PHP

Mostrador nº 3

Valor del contador:.

Abra el contador en ">esta pestaña.

Dale cuerda al contador y cierra el navegador, después de 30 segundos abre este ejemplo nuevamente. Tu sesión se guardará.

Las sesiones en PHP o como datos sobre un usuario o cliente que visita un sitio se guardan al moverse entre las páginas de un sitio sin mucha dificultad. La lección es muy importante. Relevante para la creación del 95% de los sitios web.

¿Qué es una sesión en php?

Las sesiones se utilizan para almacenar datos temporales (por ejemplo, que un usuario ha visitado un sitio) cuando navega entre páginas de un mismo sitio. Cuando se utilizan sesiones, los datos se almacenan en archivos temporales en el servidor.
La mayoría de las veces, las sesiones (y también las cookies) se utilizan al crear tiendas en línea, foros, foros de mensajes, redes sociales, blogs y otros recursos. La conveniencia del sistema de sesión es almacenar información temporal del usuario/cliente que ha iniciado sesión, cuyos datos son rápidamente accesibles durante un tiempo determinado. La sesión tiene una fecha de vencimiento natural, hasta que se cierra el navegador. Si cierra solo la página, cuando abra el sitio, los datos sobre el usuario/cliente seguirán estando disponibles.

Lógica de sesión

La sesión (o sesión) es un tipo de almacenamiento temporal de datos. Te advierto de inmediato que vale la pena guardar una pequeña cantidad de datos. Por ejemplo, el nombre de usuario y contraseña del usuario visitante o su número de serie en la base de datos.

ejemplo de trabajo
1. El usuario ingresa su nombre de usuario y contraseña e ingresa al sitio.
2. Los datos con nombre de usuario y contraseña se guardan en una sesión de una de las páginas del sitio:

Archivo index.php

inicio_sesión(); // cada archivo en el que desee utilizar datos de sesión debe contener un comando "iniciar sesión" al principio del código

$iniciar sesión = "administrador";
$contraseña = "contraseña";
$_SESSION["iniciar sesión"] = $iniciar sesión; // guarda una variable que contiene el inicio de sesión
$_SESSION["contraseña"] = $contraseña; //guarda una variable que contiene la contraseña

3. Cuando vaya a otra página del sitio, estos datos también estarán disponibles:

Archivo ejemplo.php(o cualquier otra página)

Echo "Su inicio de sesión".$_SESSION["login"]; // mostrará "Su inicio de sesión es administrador", ¡aunque no registramos ningún dato en esta página!
¡Mira, es simple!

4. Si desea borrar los datos de la sesión, todo lo que necesita hacer es:

Archivo ejemplo.php

inicio_sesión(); // "iniciar la sesión" nuevamente

Desarmado($_SESSION["iniciar sesión"]); // así es como la variable fue dada de baja o “destruida”
echo "Su inicio de sesión".$_SESSION["iniciar sesión"]; // mostrará "Su inicio de sesión". Como lo destruimos en la última línea, no hay datos.

sesión_destroy(); // destruye la sesión. Todos los datos, incluido $_SESSION["contraseña"], ya no están ahí. Al solicitarlos se mostrará un error
En general, dicha transferencia es similar al método POST, pero ya no es necesario escribir mucho código innecesario y todos los datos transferidos de una página a otra se almacenan en archivos temporales en el servidor. Repito, las sesiones deben contener pequeñas cantidades de datos, por lo que son adecuadas para almacenar nombres de usuario/contraseñas, carritos de compras y otros volúmenes pequeños.

Pasar un valor o matriz usando una sesión PHP

Puede escribir no solo una cadena, sino también una matriz de datos en una sesión. Simplemente no se exceda con el volumen de la matriz, ya que todo esto afectará la velocidad y el espacio ocupado en el servidor.

Volvemos a utilizar una determinada página de inicio. index.php

inicio_sesión();

$r = array("uno", "dos", "tres");

$_SESSION["arr"] = $r;

A la página donde se mostrará todo.
Guardamos los datos en la sesión y seguimos el enlace a otra página, donde mostraremos todos los datos.

Archivo de destino, página prueba.php donde abrimos la matriz

inicio_sesión();
print_r($_SESSION["arr"]);
// imprimirá
/*
Formación
=> uno
=> dos
=> tres
*/
?>
Quizás quieras repasar la lección de . En general, todo debería quedar claro.

Otras funciones para trabajar con sesiones

sesión_unregister (cadena)- la sesión olvida el valor de la variable global especificada;
sesión_destroy()- la sesión se destruye (por ejemplo, si el usuario abandonó el sistema haciendo clic en el botón Salir);
session_set_cookie_params(int duración [, ruta de cadena [, dominio de cadena]])- Al utilizar esta función, puede establecer cuánto tiempo durará una sesión estableciendo un unix_timestamp que determina la hora de muerte de la sesión.

Lista de funciones para trabajar con sesiones en php
session_cache_expire: devuelve la caducidad del caché actual
session_cache_limiter: obtiene y/o establece el limitador de caché actual
session_commit es un alias para session_write_close()
session_decode: decodifica los datos de la sesión desde una cadena
session_destroy: destruye todos los datos registrados para la sesión
session_encode: cifra los datos de la sesión actual como una cadena
session_get_cookie_params: obtiene los parámetros de las cookies de sesión
session_id: obtiene y/o establece la identificación de la sesión actual
session_is_registered: determina si la variable está registrada en la sesión
session_module_name - obtiene y/o establece el módulo de sesión actual
session_name: obtiene y/o establece el nombre de la sesión actual
session_regenerate_id: modifica la identificación de la sesión actual con una recién generada
session_register: registra una o más variables para la sesión actual
session_save_path - obtiene y/o establece la ruta para guardar la sesión actual
session_set_cookie_params: establece los parámetros de las cookies de sesión
session_set_save_handler: establece funciones de almacenamiento de sesiones a nivel de usuario
session_start - inicializa los datos de la sesión
session_unregister: cancela el registro de una variable de la sesión actual
session_unset: libera todas las variables de sesión
session_write_close - escribe los datos de la sesión y el final de la sesión

Ejemplos de trabajo de sesión.

Contador de páginas vistas durante una sesión. Un claro ejemplo de trabajo. Sin embargo, después de cerrar el navegador, la cuenta atrás comenzará nuevamente.

Contador de visitas a una página dentro de una sesión

// Un ejemplo sencillo de uso de sesiones sin Cookies.
nombre_sesion("prueba");
inicio_sesión();
$_SESSION["cuenta"] = @$_SESSION["cuenta"] + 1;
?>

Encimera


Has abierto esta página en tu sesión actual del navegador.
veces).
Cierra tu navegador para restablecer este contador.
¡Haga clic aquí para actualizar la página!
Con cada transición el contador aumentará en 1)

¡Gracias por su atención! ¡Buena suerte en tus esfuerzos!