¿Cuándo y por qué debería usar session_regenerate_id ()?

95

¿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?

rvandoni
fuente
porque después del inicio de la sesión se crea el is y en la otra página cuando inicia sesión las variables están presentes: -
HaRsH
@HaRsH ¿Oo? Session_regenerate_id elimina el ID de sesión anterior y crea uno nuevo para evitar secuestrar la sesión con XSS, por ejemplo. No tiene ningún efecto sobre la visibilidad de las variables SESSION en otros documentos.
Xatenev
sí, sé que no tengo ningún efecto en otra variable, pero si no inicia la sesión en esa página, la variable no está presente en esa página en core php
HaRsH
1
Pero se trata de session_regenerate_id, no de session_start ...
Xatenev
1
Sugeriría leer el RFC donde se propuso: wiki.php.net/rfc/precise_session_management
jankal

Respuestas:

96

¿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:

Amal Murali
fuente
2
¿Y qué sucede si el hacker hace la vigésima llamada? El ID de sesión se cambia y él es el único propietario de la sesión;))
fred727
@ fred727 Si el pirata informático tiene la suerte de hacer la vigésima llamada, entonces el usuario tendrá una identificación no válida y ya no estará autenticado. Sin regeneración en absoluto, tanto el hacker como el usuario estarían autenticados.
Bradmage
También podría ser útil llamar a session_regenerate_id al almacenar información confidencial en las sesiones (por lo que no solo en las transiciones de autenticación)
Adam
¿Es posible fijar la sesión si la información de la sesión no está en una cookie? Estoy almacenando la información de la sesión en archivos en mi servidor, ¿es necesario volver a generar la identificación?
Gonzalo
"para fijar (fijar) el ID de sesión (SID) de otro usuario" .... esto debe ser reemplazado por "para fijar (fijar) un ID de sesión (SID) en la computadora de otro usuario, luego usarlo después de que él lo autentique "
Contador م
25

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:

Guía de seguridad de PHP: sesiones

Fijación de sesión (buena lectura)

Dimag Kharab
fuente
22

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).

Machavity
fuente
2
HTTPS no cambia nada en la fijación.
kelunik
4
Pero hace que los ataques de rastreo sean más difíciles que podrían usarse para obtener la identificación de la sesión en primer lugar.
demonkoryu
mi aplicación php se desconecta en segundos, estoy usando la regeneración, ¿hay un límite de archivos de sesión que se pueden hacer o hay un límite en los identificadores regenerados que podrían estar causando el cierre de sesión?
sqlchild
Generalmente no, no. Es posible que desee publicar una pregunta separada al respecto
Machavity
16

¿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 httpOnlybandera para evitar el acceso a través de javascript). Imaginemos que Stack Overflow tenía HTTPS siempre habilitado y también el secureindicador 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.

Kelunik
fuente
Pero hasta el momento en que se session_regenerate_id()emitió, ¿Alice puede acceder a la cuenta de bobs? ¿está bien?
Akam
2
@akam - Es tarde, pero vale la pena responder ... 1. Bob no cierra la sesión, Alice puede usar su inicio de sesión - 2. Bob cierra la sesión, Alice no inicia sesión, Alice puede usar su ID de sesión, pero no hay un inicio de sesión activo para acceder a sus datos - 3. Bob cierra la sesión, Alice inicia sesión, Bob usa el ID de sesión, hay un inicio de sesión activo, Bob accede a los datos de Alice. Pero para ser específico: dependiendo de la seguridad de los scripts, una ID de sesión no significa necesariamente que pueda acceder a los datos de un usuario desconectado, pero en general es posible y de alto riesgo.
codekandis
15

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.

Hasan Veli Soyalan
fuente
12

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.

Pedro
fuente
4

session_regenerate_id (): No se puede regenerar la identificación de la sesión - la sesión no está activa

if(session_status() == PHP_SESSION_ACTIVE)
{
    session_regenerate_id();
}
Anton
fuente