php - fin - ¿Cuándo y por qué debería usar session_regenerate_id()?
inicio y fin en php (7)
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();
}
¿Por qué y cuándo debería usar la función session_regenerate_id()
en php? ¿Debería usarlo siempre después de usar session_start()
? He leído que tengo que usarlo para evitar la fijación de la sesión, ¿es esta la única razón?
¿Por qué debería usar session_regenerate_id
?
Debe usarlo para evitar la https://www.owasp.org/index.php/Session_fixation .
¿Cuándo debería usar session_regenerate_id
?
Cada vez que cambia el estado de autenticación, eso se produce principalmente al inicio y cierre de sesión.
Ejemplo
Bob se sienta en una computadora pública y navegando en .com abre una nueva sesión allí. El ID de la sesión se guarda en una cookie (con el indicador httpOnly
para evitar el acceso a través de javascript). Imaginemos que tenía HTTPS siempre habilitado y también el indicador de secure
establecido para la cookie.
¿Cómo podemos robar la sesión ahora?
Bob escribe la ID de la sesión. Él deja la computadora sin cerrar el navegador. Ahora Alice llega a esta computadora y ve que ya está cargado. Ella inicia sesión ahora.
Ahora estamos en la etapa en la que debes 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 anotado para acceder a la sesión de Alicia y se registraría como Alicia ahora.
¿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?
Principalmente ayuda a prevenir ataques de fijación de sesiones. Los ataques de fijación de sesión es cuando un usuario malintencionado intenta explotar la vulnerabilidad en un sistema para fijar (configurar) la ID de sesión (SID) de otro usuario. Al hacerlo, obtendrán acceso completo como usuario original y podrán realizar tareas que de otro modo requerirían autenticación.
Para evitar dichos ataques, asigne al usuario una nueva ID de sesión utilizando session_regenerate_id()
cuando session_regenerate_id()
sesión con éxito (o para cada X solicitudes). Ahora solo él tiene la ID de la sesión y su ID de sesión anterior (fija) ya no es válida.
¿Cuándo debería usar session_regenerate_id()
?
Como señala symbecean en los comentarios a continuación, la identificación de la sesión debe cambiarse en cualquier transición en estado de autenticación y solo en las transiciones de autenticación.
Otras lecturas:
Creo que el tema del envenenamiento de la sesión se ha cubierto bastante bien.
Para responder al "¿Cuándo debería usar esto?" Por esta razón, 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 clave de seguridad que necesita responder
Si alguien obtuviera esta sesión, ¿qué ganarían?
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 al tomar esa sesión.
Muchos sitios ofrecen inicios de sesión, sin embargo. Un inicio de sesión cambia muchas cosas. Puedo acceder a mi perfil Puedo cambiar la configuración Entonces, un secuestrador podría querer que mi cuenta acceda, especialmente si los usuarios normales y administradores usan sesiones para administrar el inicio de sesión. Entonces, cuando las personas acceden a mi sitio e inician sesión, vuelvo a generar la sesión. Agrega una capa adicional de seguridad de que mi usuario recién conectado tiene menos probabilidades de ser secuestrado.
Cada vez que agreguemos datos críticos a una sesión, debería considerar regenerar la ID de la sesión. Si necesita reforzar su aplicación contra la fijación, una regeneración aleatoria puede ser útil, pero NUNCA volvería a generar en cada solicitud. Por defecto, PHP almacena 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 realizar HTTPS completos en vez de regenerarlos regularmente (HTTPS hace que la fijación sea muy difícil de lograr).
Debe usar session_regenerate_id()
para detener el secuestro de la sesión y la fijación de la sesión .
De esta respuesta de Security.SE :
El secuestro de sesión se refiere al robo de la cookie de sesión. Esto puede lograrse más fácilmente cuando se comparte una red local con otras computadoras. Por ejemplo, en Starbucks. Ejemplo ... un usuario con la sesión Y está navegando por el sitio web de James en Starbucks. Estoy escuchando su tráfico de red, bebiendo mi café con leche. Llevo al 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.
De esta página web :
La fijación de sesión es una técnica de ataque que fuerza la ID de sesión de un usuario a un valor explícito. Dependiendo de la funcionalidad del sitio web objetivo, se pueden utilizar varias técnicas para "corregir" el valor de ID de la sesión. Estas técnicas van desde exploits de Cross-site Scripting hasta acribillar el sitio web con solicitudes HTTP previamente realizadas. Después de que se haya solucionado el ID de la 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:
Puedes usarlo para una mejor seguridad.
De esta manera estás creando id de sesión para un uso único.
Digamos que su ID de sesión de usuario es = 3
Algunos piratas informáticos piratearon su cliente y obtuvieron su session_id. Así que los hackers pueden usar esa cookie para usar su sesión.
Si tienes código como
session_start();
session_regenerate_id();
puede cambiar su sesión cada vez que usa su sitio web.
Ahora el hacker obtiene sessionid = 3
pero has cambiado la sesión después de usar eso para que
el usuario tiene sessionid = 4 // auth
hacker tiene session = 3 // null
Pero hay un pequeño punto digamos que está utilizando el método de regeneración y su cliente acaba de iniciar sesión en el sitio web y cerrar el navegador o inactivo. Su cliente tiene sessionid = 4 y si el hacker obtiene cookies en esa parte, tendrá el mismo sessionid.
Como se explicó anteriormente, de esta forma puede proteger a su cliente contra el rastreo 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 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 compras del usuario se identifica por su identificación de sesión.
// User orders items
$shopcart->add(''123'', 20);
$shopcart->add(''124'', 18);
$shopcart->add(''127'', 5);
Para cada producto agregado, se realiza un registro en mi mesa de compras. También identificado por la identificación de la sesión.
// User saves cart in order to use it later
$shopcart->save();
El usuario decidió guardar su carrito. Ahora se está adjuntando 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 sessión se regenera y el usuario ahora puede comenzar a crear otra carretilla.