¿Por qué y cuándo debería usar la session_regenerate_id()
función en php? ¿Debería usarlo siempre después de usar el session_start()
? He leído que tengo que usarlo para evitar la fijación de sesiones, ¿es esta la única razón?
php
session
session-fixation
rvandoni
fuente
fuente
Respuestas:
¿Qué es
session_regenerate_id()
?Como dice el nombre de la función, es una función que reemplazará la ID de la sesión actual por una nueva y mantendrá la información de la sesión actual.
¿Qué hace?
Ayuda principalmente a prevenir ataques de fijación de sesiones. Los ataques de fijación de sesiones son cuando un usuario malintencionado intenta explotar la vulnerabilidad en un sistema para fijar (fijar) el ID de sesión (SID) de otro usuario. Al hacerlo, obtendrán acceso completo como el usuario original y podrán realizar tareas que de otro modo requerirían autenticación.
Para evitar tales ataques, asigne al usuario una nueva ID de sesión
session_regenerate_id()
cuando inicie sesión correctamente (o por cada X solicitudes). Ahora solo él tiene el ID de sesión, y su antiguo ID de sesión (fijo) ya no es válido.¿Cuándo debo usar
session_regenerate_id()
?Como symbecean señala en los comentarios a continuación, la identificación de la sesión debe cambiarse en cualquier transición en el estado de autenticación y solo en las transiciones de autenticación.
Otras lecturas:
fuente
Debe usar
session_regenerate_id()
para detener el secuestro y la fijación de sesiones .De esta respuesta Security.SE :
Desde esta página web :
Cuándo usar
Cuando el usuario está editando / actualizando algunas entradas importantes (cambio de contraseñas, credenciales, contraseñas olvidadas, etc.) que pueden comprometer la seguridad del sitio o la política de privacidad.
Ver también:
Guía de seguridad de PHP: sesiones
Fijación de sesión (buena lectura)
fuente
Creo que el tema del envenenamiento de sesiones se ha cubierto bastante bien.
Para responder a la pregunta "¿Cuándo debería usar esto?" parte, es importante dar un paso atrás y considerar qué está haciendo su aplicación con la sesión. O, para decirlo de otra manera, esta es la pregunta de seguridad clave que debe responder
Si todo lo que hace es rastrear datos anónimos (el usuario llega al sitio y lo usa para rastrear sus visitas), entonces hay pocas razones para regenerar una sesión. Un secuestrador no ganaría nada de valor con esa sesión.
Sin embargo, muchos sitios ofrecen inicios de sesión. Un inicio de sesión cambia muchas cosas. Puedo acceder a mi perfil. Puedo cambiar la configuración. Por lo tanto, un secuestrador podría querer acceso a mi cuenta, especialmente si los usuarios normales y administradores usan sesiones para administrar el inicio de sesión. Entonces, cuando la gente viene a mi sitio e inicia sesión, regenero la sesión. Agrega una capa adicional de seguridad que es menos probable que mi usuario recién conectado sea secuestrado.
Cada vez que agregamos datos críticos a una sesión, debe considerar la posibilidad de volver a generar el ID de sesión. Si necesita fortalecer su aplicación contra la fijación, entonces una regeneración aleatoria puede ser útil, pero NUNCA regeneraría en cada solicitud. Por defecto, PHP almacena las sesiones en archivos en el disco local. Está agregando una gran cantidad de E / S de disco para mitigar lo que es un vector de ataque relativamente pequeño. Si realmente necesita más seguridad, recomendaría usar HTTPS completo en lugar de regenerar de forma regular (HTTPS hace que la fijación sea muy difícil de lograr).
fuente
¿Por qué debería usar
session_regenerate_id
?Debe usarlo para evitar la fijación de la sesión .
¿Cuándo debo usar
session_regenerate_id
?Siempre que cambia el estado de autenticación, se trata principalmente de iniciar y cerrar sesión.
Ejemplo
Bob se sienta en una computadora pública y al navegar por stackoverflow.com abre una nueva sesión allí. El ID de la sesión se guarda en una cookie (con
httpOnly
bandera para evitar el acceso a través de javascript). Imaginemos que Stack Overflow tenía HTTPS siempre habilitado y también elsecure
indicador establecido para la cookie.¿Cómo podemos robar la sesión ahora?
Bob escribe el ID de la sesión. Deja la computadora sin cerrar el navegador. Ahora Alice llega a esta computadora y ve que Stack Overflow ya está cargado. Ella inicia sesión ahora.
Ahora estamos en la etapa en la que debería usar
session_regenerate_id
. Si no crea una nueva ID de sesión aquí durante el inicio de sesión, Bob podría usar la sesión anterior que había escrito para acceder a la sesión de Alice y ahora iniciaría sesión como Alice.fuente
session_regenerate_id()
emitió, ¿Alice puede acceder a la cuenta de bobs? ¿está bien?Puede usarlo para mayor seguridad.
De esta manera, está creando identificadores de sesión para un solo uso.
Digamos que su ID de sesión de usuario es = 3
Algún hacker hackeó su cliente y obtuvo su session_id. Entonces, el hacker puede usar esa cookie para usar su sesión.
Si tienes un código como
puede cambiar su sesión cada vez que utilizan su sitio web.
Ahora el hacker obtiene sessionid = 3
pero ha cambiado de sesión después de que él lo use, por lo que su
el usuario tiene sessionid = 4 // auth
hacker tiene sesión = 3 // nulo
Pero hay un pequeño punto, digamos que está utilizando el método de regeneración y su cliente simplemente inicia sesión en el sitio web y cierra el navegador o está inactivo. Su cliente tiene sessionid = 4 y si el hacker obtiene cookies en esa parte, tendrán el mismo sessionid.
Como se explicó anteriormente, de esta manera, puede proteger a su cliente de la detección de datos de una manera, pero aún así, no solucionará este problema para siempre.
Pero será mucho más seguro si usa SSL enc.
Perdón por el mal inglés.
fuente
Un caso de uso simple:
Se inicia una sesión y se realiza una entrada en la base de datos. El carrito de la compra del usuario se identifica por su ID de sesión.
Por cada producto agregado, se hace un registro en mi mesa de carrito de compras. También identificado por el ID de sesión.
El usuario decidió guardar su carrito. Ahora se adjunta a su identificación de usuario.
La identificación de sesión se regenera y el usuario ahora puede comenzar de nuevo a crear otro carrito de la compra.
fuente
fuente