¿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?
¿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?
Respuestas:
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.
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.
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:
Debe usar session_regenerate_id()
para detener el secuestro y la fijación de sesiones .
De esta respuesta Security.SE :
El secuestro de sesión se refiere al robo de la cookie de sesión. Esto se puede lograr más fácilmente cuando se comparte una red local con otras computadoras. Por ejemplo, en Starbucks. Ejemplo ... un usuario con sesión Y está navegando por el sitio web de James en Starbucks. Estoy escuchando el tráfico de su red, tomando mi café con leche. Tomo el usuario con las cookies de la sesión Y para el sitio web de James y configuro mi navegador para usarlas. Ahora, cuando accedo al sitio de James, el sitio de James.
Desde esta página web :
La fijación de sesión es una técnica de ataque que obliga a la identificación de sesión de un usuario a un valor explícito. Dependiendo de la funcionalidad del sitio web de destino, se pueden utilizar varias técnicas para "fijar" el valor de ID de sesión. Estas técnicas van desde las vulnerabilidades de Cross-site Scripting hasta la saturación del sitio web con solicitudes HTTP realizadas previamente. Una vez que se ha corregido el ID de sesión de un usuario, el atacante esperará a que ese usuario inicie sesión. Una vez que el usuario lo hace, el atacante usa el valor de ID de sesión predefinido para asumir la misma identidad en línea.
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:
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 alguien tuviera esta sesión, ¿qué ganaría?
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).
session_regenerate_id
?Debe usarlo para evitar la fijación de la sesión .
session_regenerate_id
?Siempre que cambia el estado de autenticación, se trata principalmente de iniciar y cerrar sesión.
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 el secure
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.
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
session_start();
session_regenerate_id();
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.
Un caso de uso simple:
// User visits a webshop
$shopcart = new Cart();
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.
// User orders items
$shopcart->add('123', 20);
$shopcart->add('124', 18);
$shopcart->add('127', 5);
Por cada producto agregado, se hace un registro en mi mesa de carrito de compras. También identificado por el ID de sesión.
// User saves cart in order to use it later
$shopcart->save();
El usuario decidió guardar su carrito. Ahora se adjunta a su identificación de usuario.
// Regenerate session id for user to be able to make a new cart
session_regenerate_id();
La identificación de sesión se regenera y el usuario ahora puede comenzar de nuevo a crear otro carrito de la compra.