¡Advertencia!
Este tema no ha tenido respuestas en más de un mes. Recuerda que si deseas añadir una nueva debes cumplir con las normas de la web.
Hola chicos. Estoy desarrollando un sistema de usuarios para un proyecto, que espero que no acabe en el olvido. Quiero hacerlo bien hecho. Espero que sea la aplicación mejor programada por mi hasta el momento, (es decir, un churro de clase media, no sé todo lo seguro que es xD).

Por el momento, no pido ningún código ni nada por el estilo, sino saber como podría hacer lo que quiero. Os explico las cosa que quiero:

* Lista de usuarios registrados que están conectados. También contar el número de ellos.
* Poder cerrar la sesión de uno de ellos o de todos desde la base de datos.
* Cualquier otra cosilla que podría ser interesante.

Leyendo algún artículo. Pero tampoco tengo muy claro como hacerlo. Entonces, por lo que más o menos he entendido, haría una cosa así:

Organización de la base de datos:
Tabla sesiones:
id_usuario
sesion: cookie de la sesion
Identificador: numero aleatori de seguridad.
Ultima_conexion: que no se si ponerlo, porque ya lo tengo puesto en la tabla usuarios, y sería duplicar cosas.

Cierre de sesión desde el panel de administración.
Lo que haría sería comparar las cookies que he guardado con en el ordenador con las que están guardadas en la base de datos. Si coinciden, el usuario iniciaría sesión, si no coincide, se le borraría la sesión que ya tuviese.

Por tanto, si elimino los datos de la tabla sesiones de un usuario, se le cerraría la sesión.

Cierre de sesión por inactividad.
Esto no sé como sería conveniente hacerlo, si comparando con la última conexión que aparece en la base de datos, o con sesiones, o con cookies guardadas en el ordenador. ¿Cual me recomendariáis? Veo las tres formas posibles, pero me quiero decantar por la que sea más segura y al mismo tiempo sea algo que optimice los recursos en el servidor.

Optimización de recursos en el servidor
Para mostrar la lista de usuarios conectados, que no tengo pensado ponerlo tipo foro, abajo del todo, sino en una página y que el usuario lo visite si él quiere, no veo problemas de optimización.

Sin embargo, para contar el número de usuarios conectados lo que tengo pensado hacer es es mirar los usuarios que han estado conectados en los últimos 15 minutos, por ejemplo. Para hacer esto sería simplemente con mysql_num_rows, por lo que tampoco creo que en principio consuma recursos de forma exagerada.

Sin embargo, se me puede acumular una tabla gigantesca a la larga que los usuarios que ya no visitan el sitio tengan ahí acumuladas sus sesiones, por lo que podría hacer es que cada vez que se cuente el número de usuarios activos borre las sesiones viejas, pero eso sí que creo que podría consumir muchos recursos inútiles. Por lo que podría hacerse una vez al día, o a la semana, a una hora en la que haya pocas visitas, yo qué sé, las 5 o 6 de la mañana. Vamos, en realidad, que se ejecute el script con la primera visita después de las 5 o 6 de la mapana ¿Qué pensáis?

Seguridad
Tengo algunas dudas existenciales en cuanto a seguridad. ¿Las sesiones se guardan en una cookie del usuario? Es que tengo pensado guardar el rango y el id del usuario y el nombre de usuario (y en el futuro igual alguna otra cosa del sitio) en una sesión. Y no sé si guardarlo en una sesión es seguro, porque igual un usuario malicioso edita las cookies. Lo hago más que nada para no tener que conectar con la base de datos todo el rato y ahorrar recursos.

Edito: si no guardo al menos el id del usuario en una sesión, ¿cómo lo hago? xDD

También me acabo de dar cuenta que en campos como nombre de usuario nunca pongo ninguna función para quitar el html, solo mysql_real_escape_string. ¿Grave error, no?

Hola chicos. Estoy desarrollando un sistema de usuarios para un proyecto, que espero que no acabe en el olvido. Quiero hacerlo bien hecho. Espero que sea la aplicación mejor programada por mi hasta el momento, (es decir, un churro de clase media, no sé todo lo seguro que es xD).

Por el momento, no pido ningún código ni nada por el estilo, sino saber como podría hacer lo que quiero. Os explico las cosa que quiero:

* Lista de usuarios registrados que están conectados. También contar el número de ellos.
* Poder cerrar la sesión de uno de ellos o de todos desde la base de datos.
* Cualquier otra cosilla que podría ser interesante.

Leyendo algún artículo. Pero tampoco tengo muy claro como hacerlo. Entonces, por lo que más o menos he entendido, haría una cosa así:

Organización de la base de datos:
Tabla sesiones:
id_usuario
sesion: cookie de la sesion
Identificador: numero aleatori de seguridad.
Ultima_conexion: que no se si ponerlo, porque ya lo tengo puesto en la tabla usuarios, y sería duplicar cosas.

Cierre de sesión desde el panel de administración.
Lo que haría sería comparar las cookies que he guardado con en el ordenador con las que están guardadas en la base de datos. Si coinciden, el usuario iniciaría sesión, si no coincide, se le borraría la sesión que ya tuviese.

Por tanto, si elimino los datos de la tabla sesiones de un usuario, se le cerraría la sesión.

Cierre de sesión por inactividad.
Esto no sé como sería conveniente hacerlo, si comparando con la última conexión que aparece en la base de datos, o con sesiones, o con cookies guardadas en el ordenador. ¿Cual me recomendariáis? Veo las tres formas posibles, pero me quiero decantar por la que sea más segura y al mismo tiempo sea algo que optimice los recursos en el servidor.

Optimización de recursos en el servidor
Para mostrar la lista de usuarios conectados, que no tengo pensado ponerlo tipo foro, abajo del todo, sino en una página y que el usuario lo visite si él quiere, no veo problemas de optimización.

Sin embargo, para contar el número de usuarios conectados lo que tengo pensado hacer es es mirar los usuarios que han estado conectados en los últimos 15 minutos, por ejemplo. Para hacer esto sería simplemente con mysql_num_rows, por lo que tampoco creo que en principio consuma recursos de forma exagerada.

Sin embargo, se me puede acumular una tabla gigantesca a la larga que los usuarios que ya no visitan el sitio tengan ahí acumuladas sus sesiones, por lo que podría hacer es que cada vez que se cuente el número de usuarios activos borre las sesiones viejas, pero eso sí que creo que podría consumir muchos recursos inútiles. Por lo que podría hacerse una vez al día, o a la semana, a una hora en la que haya pocas visitas, yo qué sé, las 5 o 6 de la mañana. Vamos, en realidad, que se ejecute el script con la primera visita después de las 5 o 6 de la mapana ¿Qué pensáis?

Seguridad
Tengo algunas dudas existenciales en cuanto a seguridad. ¿Las sesiones se guardan en una cookie del usuario? Es que tengo pensado guardar el rango y el id del usuario y el nombre de usuario (y en el futuro igual alguna otra cosa del sitio) en una sesión. Y no sé si guardarlo en una sesión es seguro, porque igual un usuario malicioso edita las cookies. Lo hago más que nada para no tener que conectar con la base de datos todo el rato y ahorrar recursos.

Edito: si no guardo al menos el id del usuario en una sesión, ¿cómo lo hago? xDD

También me acabo de dar cuenta que en campos como nombre de usuario nunca pongo ninguna función para quitar el html, solo mysql_real_escape_string. ¿Grave error, no?


Haber, si he entenido bién, ¿quieres resolver dudas no?

Haber, para el
"* Lista de usuarios registrados que están conectados. También contar el número de ellos"

Deja el campo de "Ultima_conexion" en la db, ya verás como te sirve
Ahora, ejecuta un SELECT en la db desde tu web que seleccione a las ultimas sesiones de los usuarios, y que si puede ser lo guarde en formato time(); (si no, habría que hacer un strtotime()), después, usando el formato time(), haz que seleccione sólo los que el campo "Ultima_conexion" sea cercana a time() - 900; (Si no recuerdo mal, vendría a ser el tiempo actual - 15 minutos), así te mostrara los usuarios activos en los últimos quince minutos, si quieres puedes poner time() sin nada, mostraría en tiempo real, pero así quitas sesiones. Luego un mysql_num_rows para contarlo y un while con su mysql_fetch_array para imprimirlo si quieres

Para el
"*Poder cerrar sesión de uno de ellos o de todos desde la base de datos"

Si es una sesión de las de toda la vida, como has dicho, simplemente tienes que borrarla, en cuanto a la otra, haz que el cookie (el nombre) pueda variar desde la db, así al cambiarlo desde la db, echarás a todas las sesiones.

Sobre lo de acumular, haz que se actualice en tiempo real si ya existe una sesión apuntada para ese usuario con sentencias, así te ahorras huecos y no petas la db. También puedes realizarlo automáticamente cuando se lo mandes desde el panel admin para borrar o vaciar sesiones inutiles con el time() menor al actual en 15 minutos, o que se limpie cada vez que alguien visite el script de visitas, tu veras :chicle:.

Por otro lado, en cuanto a la seguridad con cookies, te recomiendo que hagas algo similar, por ejemplo, envíes así la Cookie de la ID
$_SETCOOKIE("id_usuario", "a45zb5e".$variableid."ab9s6d6f");
(quedaría la cookie si la id fuera 12 (por ejemplo), a45zb5e12ab9s6d6f, luego, para averiguar la id, usas un explode y vas sacando, el uno sería la octava letra, así que $explode[7], para el segundo numero, una sentencia para saber que no es a, y si no lo es, tambien cuentas a $explode[8] y así...

Espero haberte ayudado, bueno, sigo a lo que estaba xD

¡Soy el fantasma de Habtium! Me dedico a reemplazar aquellas cuentas que han sido eliminadas. 👻
Sobre los últimos conectados:

Yo había pensado en que la última conexión fuese la última vez que iniciase sesión, no la última vez que estuvo activo en el sitio. Veo un poco exagerado que por cada pagina que cargue el usuario se guarde la última conexión en la base de datos, no sé, ¿no consumirá mucho? Es que no tengo ni idea de lo que consume una consulta en la base de datos, y me preocupa eso. Que ya bastante consumo le debo meter guardando todos los textos en arrays. Que lo pongo así para en el futuro poder hacer editables esos textos de alguna forma, no me refiero a noticias o artículos, sino para poder editar todo el texto de la web. Pero esa es otra historia.

Volviendo a lo de la última conexión, yo lo que tengo puesto es que la última conexión se guarde en una sesión, pero podría cambiar una cosa por otra...


Si es una sesión de las de toda la vida, como has dicho, simplemente tienes que borrarla, en cuanto a la otra, haz que el cookie (el nombre) pueda variar desde la db, así al cambiarlo desde la db, echarás a todas las sesiones.

Pero con eso echaría a todos los usuarios. Por eso hablo de guardar una copia de las cookies en la base de datos y otra en el ordenador. Después se compara, y si no son iguales, le cierra sesión. Ahora que lo pienso, es mucho más sencillo. Podría poner un campo en la base de datos que si tiene un 1 como valor, le cierra la sesión xD. De todas formas supongo que no te lo habrás leído todo, que lo comprendo, porque mira que no he metido un tostón.

¿Y las sesiones pueden ser editadas y trucadas? ¿También les tengo que aplicar una capa de seguridad como a las cookies? ¿Qué diferencia habría entre utilizar sesiones y cookies? Es algo que siempre he querido saber.

Y sí, si me has ayudado, gracias

Sobre los últimos conectados:

Yo había pensado en que la última conexión fuese la última vez que iniciase sesión, no la última vez que estuvo activo en el sitio. Veo un poco exagerado que por cada pagina que cargue el usuario se guarde la última conexión en la base de datos, no sé, ¿no consumirá mucho? Es que no tengo ni idea de lo que consume una consulta en la base de datos, y me preocupa eso. Que ya bastante consumo le debo meter guardando todos los textos en arrays. Que lo pongo así para en el futuro poder hacer editables esos textos de alguna forma, no me refiero a noticias o artículos, sino para poder editar todo el texto de la web. Pero esa es otra historia.

Volviendo a lo de la última conexión, yo lo que tengo puesto es que la última conexión se guarde en una sesión, pero podría cambiar una cosa por otra...
Pero con eso echaría a todos los usuarios. Por eso hablo de guardar una copia de las cookies en la base de datos y otra en el ordenador. Después se compara, y si no son iguales, le cierra sesión. Ahora que lo pienso, es mucho más sencillo. Podría poner un campo en la base de datos que si tiene un 1 como valor, le cierra la sesión xD. De todas formas supongo que no te lo habrás leído todo, que lo comprendo, porque mira que no he metido un tostón.

¿Y las sesiones pueden ser editadas y trucadas? ¿También les tengo que aplicar una capa de seguridad como a las cookies? ¿Qué diferencia habría entre utilizar sesiones y cookies? Es algo que siempre he querido saber.

Y sí, si me has ayudado, gracias


A lo primero, ya te dije que podrías hacer que se actualizara si el nombre o id del usuario ya esta registrado en las sesiones, y así te ahorrabas muchas, pero también puedes hacerlo cada vez que inicie sesión, aunque yo pienso que así es un poco menos preciso.

En cuanto a lo otro, no lo lei entero xd :chicle:, pero bueno, eso es una buena idea.

A las sesiones, les puedes poner esa "capa de seguridad", siendo algo así
$_SESSION['id'] = "a45zb5e".$variableid."ab9s6d6f";
Com con las cookies

Y la diferencia, las cookies se guardan en el navegador, por lo que duran horas, días, meses o años (por eso se ponen las multiplicaciones al lado de valores, para darle el tiempo de duración), mientras que las sesiones duran hasta que apages el ordenador. Eso sí, cuando limpias navegador, quitas cookies y sesiones xD.

La única diferencia, usando cookies, el usuario no necesitará logearse tanto.

¡Soy el fantasma de Habtium! Me dedico a reemplazar aquellas cuentas que han sido eliminadas. 👻
Supongo que pare el tema de los usuarios online acabaré haciendo lo de que se acutualice la fecha de última conexión cada vez que se actualice la página.

Y sobre las sesiones y cookies, para guardar el id, ¿qué me recomiendas? Guardo solo en las sesiones/cookies el id del usuario, ¿o también guardo el rango y esas cosa? Guardar el nombre de usuario sería en principio inofensivo.

Supongo que pare el tema de los usuarios online acabaré haciendo lo de que se acutualice la fecha de última conexión cada vez que se actualice la página.

Y sobre las sesiones y cookies, para guardar el id, ¿qué me recomiendas? Guardo solo en las sesiones/cookies el id del usuario, ¿o también guardo el rango y esas cosa? Guardar el nombre de usuario sería en principio inofensivo.


Perdona, estoy algo ausente, por lo que sé te recomiendo las cookies, y es mejor guardar bastantes datos para no tener que hacer muchisimas consultas, aunque ya sabes, encriptados por si acaso, y eso. Aun así, la contraseña mejor que no, por si acaso.

¡Soy el fantasma de Habtium! Me dedico a reemplazar aquellas cuentas que han sido eliminadas. 👻
Al final lo que he hecho es que al conectarse te genera un número aleatorio, que es encriptado y guardado en la sesión. Cuando ese número encriptado no coincide con el de la sesion, te cierra la sesión.

Y por ahorrarme una consulta, el rango lo tengo guardado en la sesión. Aunque ando pensando si guardarlo en la sesión o que cada vez que se ejecute la página cargue. Creo que mejor en la sesión, para ahorrar recursos.

También tengo que pensar como elaborar unas estadísticas de usuarios conectados por horar. Creo que ahora mismo se me acaba de ocurrir una forma muy buena.

Lo que tengo pensado es que en la tabla se recojan las visitas en franjas de 15 minutos de esta forma:
De 0:00:00 a 0:14:59 - X
De 0:14:59 a 0:29:59 - Y
De 0.29:59 a 0:44:59 - Z
...

Cuando un usuario cargue la pagina, contará como una visita en la franja en la que se encuentre, y en la franja siguiente. Obviamente, si visitase 3 páginas no puede contar como 3 usuarios activos, por lo que tambien tendre que recoger la fecha y hora de la ultima vez que contó para las estadísticas.

Tengo que ver muy bien como hacer los array para que me generen las franjas. Supongo que haré que a determinada semanalmente genere automaticamente las franjas. Como no lo alojaré en un servidor dedicado ni semidedicado que pueda programar tareas, haré que se ejecute con la primera visualización despues de la primera visita a tal hora (como siempre): Y para evitar que haya horas a las que falten sus franjas en la base de datos, haré que siempre haya creada una semana de margen o que cuando lo genere también genere las franjas de los días anteriores. O una mezcla de los dos.

Ya os contaré, si me acuerdo, como lo he hecho.
Para registrar los activos (Te recomiendo que fuera exáctamente en el login, ya verás porque):

<?php
session_start()
$identificador = rand().rand();
if ($_SESSION['logged'] == "si"){
$query = mysql_query("SELECT * FROM sessiones WHERE sesion='".$_SESSION['user']." ' ");
if ($row = mysql_fetch_array($query)){
// Ya esta registrado y activo
}else{
mysql_query("INSERT INTO sessiones (sesion,Identificador) values('".$_SESSION['user']."','".$identificador."') ") or die(mysql_error());
}
}
?>


¿Qué hacemos? Iniciamos sesion con session_start();, le agregamos un valor a la variable $identificador con 2 combinaciones de números aleatorios, hacemos un query a la tabla de sessiones para ver si ya esta registrado como activo, si ya esta registrado, muestra normal, si nó, lo agregamos a la tabla.

Para cerrar los conectados:


<?php
session_start();
$query = mysql_query("SELECT * FROM sessiones WHERE sesion='".$_SESSION['user']." ' ");
if ($row = mysql_fetch_array($query)){
// No le cerraste session
}else{
session_destroy(); // Le cierras la sesion si no esta en la tabla de sesiones ;)
}
?>


¿Qué hacemos? Iniciamos sesion con session_start();, hacemos un query a la tabla sessiones para comprobar que este registrado en la tabla, si esta registrado muestra contenido de página, si no esta registrado en la tabla (que le cerraste la sessión) le cierra la sesión a él.

¿Por qué? Porque al tu eliminar el identificador/sesion en la tabla, y al hacer un "check" en el query y no esta en la tabla (obviamente por que le eliminaste la conexión literalmente) se la cerrará a él, si a el no se la cerraste, seguirá normal.

Cerrar todas ó una en específico:
Para vacíar solo una utilizas "delete from sessiones where id='".$id_usuario."", te recomendaría hacer un panel admin en donde te liste todas las conexiones activas (puedes hacer un bucle while [mientras haya datos que te los muestre]), en donde tenga un link a digamos ?do=cerrar&id=id, y ya puedes hacer digamos "if ($_GET['do'] == "cerrar" && $_GET['id'] != ""){}" y ahi le pones un query que te tome el valor del GET "id" y lo cierre.

Si quieres vacíar todas con truncate sessiones te cerraría todas, saludos.

Editado: Se me olvido contar el número de activos, con mysql_num_rows(); te mostraría el número de filas que están en el instante.

Idea: Puedes hacer que si tu no le cierras la sessión y el da click en "cerrar sesión" lo elimine de la tabla, ejemplo:

<?php
session_start();
//Aqui tendria que ir algo como $_SESSION['id']
if ($_GET['do'] == "salir_usuario"){
mysql_query("DELETE FROM sessiones WHERE id='".$_SESSION['id']."' ");
}
?>


Ojo: No es la ID de la sesion en sí, si no el id del número de fila a eliminar.

Aunque metele seguridad para que solo se pueda cerrar la sesion de el mismo, y a la vez asi no te vas llenando de datos inactivos (que no estan conectados).

¡Soy el fantasma de Habtium! Me dedico a reemplazar aquellas cuentas que han sido eliminadas. 👻
Más o menos lo que tengo puesto. Ya dije que ahora lo que me interesa es hacer estadísticas de usuarios conectados en las distintas horas, que mañana o pasado me pondré.

Gracias de todas formas.

Más o menos lo que tengo puesto. Ya dije que ahora lo que me interesa es hacer estadísticas de usuarios conectados en las distintas horas, que mañana o pasado me pondré.

Gracias de todas formas.


Mi error no haber leído que lo tenías resuelto y sobre las estadísticas en la misma tabla sesion puedes agregar rangos de hora scon date() y hacer una operación y te vaya tirando el tiempo que llevan en línea, digamos Inicio sesión - Final sesión = Tiempo en línea, ó en el mismo script ponerle un condiciona de cuando date sea el resultado de una sumatoria de 15 minutos se agrege a tu "rango de sesión". Salu2

¡Soy el fantasma de Habtium! Me dedico a reemplazar aquellas cuentas que han sido eliminadas. 👻
Mostrar los usuarios conectados es fácil. Yo lo que quiero es tener una estadística que te diga que el día tal a esta hora había tantos usuarios conectados.

Aquí tengo explicado como quiero hacerlo: http://www.habbos.es/forum/?topic=37919.msg513478#msg513478

De todas formas, miraré como se hace para hacer una estadística de visitas en un día, y lo aplicaré esto.

Mostrar los usuarios conectados es fácil. Yo lo que quiero es tener una estadística que te diga que el día tal a esta hora había tantos usuarios conectados.

Aquí tengo explicado como quiero hacerlo: http://www.habbos.es/forum/?topic=37919.msg513478#msg513478

De todas formas, miraré como se hace para hacer una estadística de visitas en un día, y lo aplicaré esto.


Perdona, estoy algo ausente, pero si a lo que te refieres es a guardarlos según el día y hora exactas, pues que guarde a parte cada hora que pase (usando date) a través de alguien conectado que en esa hora del día habia x usuarios, y si ya esta escrito eso, que no se actualice.

Creo que me entiendes :l.

¡Soy el fantasma de Habtium! Me dedico a reemplazar aquellas cuentas que han sido eliminadas. 👻