usuario una solo sesión sesiones sesion por permitir multisesion multiples misma inicios inicio inicie evitar equipos duplicados doble distintos cuenta con php security

una - Cómo prevenir múltiples inicios de sesión en el sitio web de PHP



inicio de sesion php mysql (6)

Quiero evitar múltiples inicios de sesión en una aplicación php.

Primero, creo el estado de inicio de sesión (activo, no activo) en una tabla de usuario.

Cuando el usuario A inicia sesión, el estado del usuario se configurará como "activo", y si el usuario cierra la sesión, el estado se establecerá como "no activo". Cuando otro cliente intenta iniciar sesión con la misma cuenta de usuario, verifico la tabla de usuarios. Si el usuario todavía está activo, el inicio de sesión de error se enviará al usuario.

El problema ocurrió, si el usuario cierra el navegador, el estado en la tabla de usuarios puede actualizarse porque el usuario no hizo clic en cerrar sesión.

¿Tienes alguna sugerencia sobre esto?


Aquí hay una solución que no requiere acceso constante a la base de datos para trabajar ...

(lo que evitará el requisito de comparar session_id () con el valor de la base de datos cada vez que solicite / actualice una página, aliviando el estrés de la base de datos / servidor) ...

1. Al iniciar sesión, tome el session_id preexistente almacenado en la base de datos para este usuario y haga esto:

session_id("the pre-existing session id in the database goes here"); session_start(); session_destroy();

2. Luego, inicie una nueva sesión y guarde este session_id nuevo en la base de datos, sobrescribiendo la anterior. Esto cerrará la sesión anterior en este usuario si hay una activa (efectivamente, desconectando al otro usuario que usa esta cuenta).

¡Pruébalo y hazme saber si eso funciona!


Debe crear una ID única y almacenarla en una base de datos. Lo que hice fue crear también. Almaceno uno en una variable de sesión y lo uso para evitar el secuestro de la sesión y otro en una base de datos para evitar inicios de sesión múltiples. El siguiente código creará una ID única:

$unique_id = sha1(''xzr4''.gethostbyaddr($_SERVER[''REMOTE_ADDR'']).$random_string.$_SERVER[''HTTP_USER_AGENT''].''f8k2'');

Si la ID única no coincide, simplemente cierre la sesión del usuario.


El uso de javascript del lado del cliente para rastrear al usuario registrado no es confiable.

Puede obtener el mismo resultado simplemente creando un campo de última sesión de registro en la base de datos y actualizándolo con la última marca de tiempo de inicio de sesión del usuario.

En cada intento de inicio de sesión, si ahora () - $ lastlogindate> predefined_timeout, debe aceptar el nuevo inicio de sesión, de lo contrario, rechácelo.


Lo que debe hacer es verificar si han estado activos durante los últimos minutos al intentar iniciar sesión. Esto podría hacerse con un sello de lastonline y debería establecerse en cada solicitud de página en la tabla de usuarios.

Si no ha terminado con javascript, puede verificar, al iniciar sesión, si el usuario estuvo activo los últimos 15 minutos. Si no, puedes iniciar sesión como el nuevo usuario.

También puedes hacerlo con javascript. Haz una llamada ajax que se dispare cada minuto más o menos.

<script> setInterval(function() { // do the ajax call }, 60000); </script>

Deje que esta llamada vaya a un script que editará el sello de lastonline en la db del usuario. Al intentar iniciar sesión, verifique la db del usuario si el sello de lastonline ha excedido el minuto y usted tiene su cheque si puede iniciar sesión. Esto le ayudará cuando esté en la página, pero no está activo los últimos 15 minutos y no desea que otra persona inicie sesión.


Puede cambiar su modelo para que solo el usuario más reciente pueda iniciar sesión.

Si registra el ID de sesión más reciente que se ha visto para cada usuario, cuando inicien sesión por segunda vez, puede descartar cualquier sesión existente, y cerrar la sesión de manera efectiva.

Para un usuario normal, las cosas parecen "simplemente funcionar". Si desea evitar que usuarios "anormales" distribuyan sus credenciales de inicio de sesión, esto debería ser un desincentivo.


(Tenga en cuenta que si bien la técnica aquí sigue siendo algo válida, las muestras de PHP no deben copiarse literalmente, ya que existen medios más seguros para incorporar valores proporcionados por el usuario en una consulta SQL)

En lugar de almacenar si el usuario está activo / inactivo, es mejor almacenar algún atributo que pueda verificarse contra el usuario en función de cada acción; como en, cada vez que el usuario intenta hacer algo que requiere autenticación, verificará que este atributo coincida antes de continuar.

Te recomiendo que hagas lo siguiente;

Primero, cree un hash para identificar de forma única al usuario cada vez que inicie sesión. Me imagino que un time() de sha1 time() sería suficiente para evitar colisiones. Elija lo que elija, asegúrese de que sea lo suficientemente variado para que otro usuario que inicie sesión tenga una probabilidad increíblemente baja de recibir el mismo hash (por ejemplo, no hash la dirección IP o el agente de usuario del navegador, ya que estos no son variados suficiente).

En segundo lugar, almacene este hash en su base de datos y en la session del usuario en el momento de iniciar sesión. Si lo hace, se "desconectará" de manera efectiva del usuario anterior, ya que el hash debe ser diferente cada vez que alguien inicie sesión.

Dado que estamos usando sesiones, se debe colocar automáticamente una cookie en el navegador del usuario que contendrá una ID única que identifique al usuario en sus datos de sesión. Los contenidos de la cookie no son realmente de interés.

A continuación, cree una función llamada authenticateUser() o similar, que se llamará al comienzo de cada script para asegurar que el usuario esté autenticado. Este script debe consultar la base de datos, verificando si un usuario con su ID de usuario tiene un hash que coincida con el hash de su usuario.

Por ejemplo:

function authenticateUser($id, $hash, $databaseLink) { # SQL $sql = ''SELECT EXISTS( SELECT 1 FROM `tbl_users` WHERE `id` = /'''.mysql_real_escape_string($id).''/' AND `hash` = /'''.mysql_real_escape_string($hash).''/' LIMIT 1 );''; # Run Query if ($query = mysql_query($sql, $databaseLink)) { # Get the first row of the results # Assuming ''id'' is your primary key, there # should only ever be one row anyway. $result = mysql_fetch_row($query); # Casting to boolean isn''t strictly necessary here # its included to indicate the mysql result should # only ever been 1 or 0. return (bool)($result[0]); } else { # Query error :( return false; } }

Luego, simplemente pasamos a authenticateUser() la ID del usuario, el hash (según los datos de su sesión) y un database link (para una conexión de base de datos que tendrá que abrir antes).

Si authenticateUser() devuelve true , el usuario se autentica. Si es false , el usuario no está O la base de datos no está disponible o hay un error de SQL.

Sin embargo, tenga en cuenta que esto aumentará su carga del servidor, ya que una solicitud de base de datos se envía una vez por solicitud de página. Probablemente no sea tan inteligente hacer esto en proyectos gigantes donde miles de personas se están conectando en un momento dado. Estoy seguro de que alguien puede sugerir mejoras.

Además, esperar a que la cookie caduque no es la mejor manera de obligar a las personas que han estado inactivas a cerrar sesión, ya que nunca debe confiar en las cookies. En su lugar, puede agregar una columna llamada last_active que puede actualizar cada vez que el usuario se autentique. Esto también aumentará la carga del servidor, pero le permitirá anular manualmente los inicios de sesión obsoletos eliminando el hash para los usuarios que estuvieron, por ejemplo, inactivos durante 3 horas.