Controlar cantidad de dispositivos

oFF-sIDE

Hola.

Tengo la posibilidad de hacer un web en la cual un cliente me pide que disponga de un número máximo de dispositivos a los que permitirle la posibilidad de login. Es decir, puede hacer login con 3 dispositivos y después de eso no permitirá más.

El caso es que he estado indagando y como esperaba, desde PHP es imposible, pero tampoco he visto el modo de hacerlo por javascript. Esperaba que existiera alguna instrucción que me permitiera saber la dirección mac del equipo pero tampoco he encontrado nada.

Lo más cerca que estoy es obtener la IP del cliente y almacenarla, pero todos sabemos que la IP puede cambiar en cada reseteo del router. Se me ocurre permitir un máximo de 3 IPs diferentes a la semana, pero esto no es lo que el cliente quiere. El caso es que tampoco tengo claro que me sirva porque múltiples clientes conectados en una LAN me devolverían la misma IP, y eso también quiero evitarlo.

¿Se os ocurre alguna idea?

Muchas gracias.

cabron

Cualquier información enviada desde el cliente se puede falsear, hasta la dirección mac, quizás deberías preguntarle cual es el motivo por el que quiere tener esa restricción y buscar otra solución.

Lo más lejos que podrías llegar es almacenar el useragent para saber sistema operativo y navegador, pero vamos que eso también se puede falsear sin problemas.

Luego tienes técnicas poco éticas de fingerprinting que no creo que hagan gracia a nadie si se enteran de que tu cliente las usa, sin contar que según se van descubriendo se van buscando formas de evitarlas.

oFF-sIDE

A ver, está claro que TODO se puede falsear. Ni el cliente ni yo pretendemos que sea inhackeable, pero los productos no van a ser tan caros como para que valga la pena calentarse demasiado la cabeza. Tampoco nos vamos a meter en técnicas poco éticas.

Busco algo que sirva de protección contra listillos (no contra hackers) y que se pueda hacer con las tecnologías convencionales. Al ser una página web y no una app, no veo el modo de acceder a la información del equipo.

Lógicamente el navegador no almacena tanta información como para que sea útil para lo que busco, y más aún sabiendo que si se actualizan el navegador o simplemente un día les da por usar otro desde el mismo equipo, ya no me servirá la información que tenía almacenada.

Es complejo eh... jajaja

¿Algún modo de obtener la dirección IP exacta dentro de una LAN?

Tunnecino

A ver, si lo que quieres es limitar los dispositivos, sin calentarte demasiado la cabeza como dices, que te parece esto:

En la app, al tercer dispositivo conectado diferente (IP + UserAgent + Nombre dispositivo o lo que quieras sacar) un alert al usuario que le indica los tres últimos dispositivos que ha conectado, y que para conectar el actual (siempre y cuando no sea de los tres últimos) necesita "bloquear" uno de los tres.

¿Qué consigues con esto? Guardar en DB los dispositivos con los que conecta habitualmente, y si el que intenta entrar no está ahí, bloquearlo, y pedirle que elimine uno para agregar el nuevo.

Limita un poco, puede llegar a dar porculete, pero así puedes tener cierto control de acceso. Estilo lo que hace Steam, por ejemplo.

1 respuesta
oFF-sIDE

#4 Cómo sacas el nombre del dispositivo? Ten en cuenta que hablamos de una página web, no de una aplicación móvil.

eXtreM3

No puedes crear un sistema súper básico de usuarios y le vas dando acceso por nick? :\

oFF-sIDE

Acceso por nick o por email da igual. El caso es que pueden coger varias personas y compartir la cuenta. La única forma es limitar la cantidad de dispositivos, pero no veo el modo. Me parece que lo de la IP es la única opción mínimamente válida.

KoRMuZ

#1 En tu tabla de usuarios, create un campo con dispositivo_conectado1, 2, y 3. Cada vez que se conecta, lo identificas como te han dicho por user_agent + sesión -o como quieras- y lo guardas en una de las celdas.

Cuando se desconecte/cada X tiempo, compruebas si siguen conectados a la web, y si no, vacías sus respectivos slots.

Cuando intente alguien una nueva conexión, si los 3 dispositivos están conectados en ese usuario, lo tiras para atrás. Si queda alguno libre, lo logeas.

babri

yo vincularía el dispositivo a la IP. Almacenas toda ip que hace login y solo utilizas 3 en caso de que te entre una 4 le mandas un mail de confirmación para que confirme que él es el usuario, y solo utilizas sus últimas 3 ip. Incluso podrías no borrar el resto o borrarlas eso ya como te apetezca.

No se si me he explicado bien xD

oFF-sIDE

Entiendo lo que proponéis y desde luego es una solución en caso de que todo lo demás fracase, pero quiero seguir indagando a ver si existe un método mejor.

Se me está ocurriendo que puedo usar el localstorage para dejar algo parecido a una "semilla" y buscarla cada vez que entro en la web. Si la tiene, ok. Si no la tiene, consulto en la base de datos si existe y si no existe compruebo si ya hay otras 3. Se me ocurre que puede ir por ahí el asunto.

Lo malo es que tendría que usar PHP para escribir código javascript (el que de verdad tiene acceso al localstorage del cliente). Es muy cutre, pero es lo único que se me ocurre. Ya vería cómo lo ofusco para que no sea trivial localizarlo y hackearlo.

O

La forma más sencilla es utilizar algo de cache memcached/redis o simplemente la SESSION de php si no quieres utilizar base de datos.
Almacenas el usuario y el numero de dispositivos activos.
Lo más complicado es controlar el tema de cuando expira la session del usuario y cosas similares, pero no es nada del otro mundo.

1 respuesta
oFF-sIDE

#11 Vamos a ver, yo doy por hecho que la base de datos la voy a usar. Lo que no puedo saber son los dispositivos activos. Controlar la expiración de la sesión no es demasiado complejo. Lo complejo es saber quien se está logeando.

He pensado también que prestashop permite un número limitado de descargas. Eso también sería una opción, aunque no es lo que más me gusta.

1 respuesta
KoRMuZ

#12 cuando vaya a conectarse alguien, vas a leer de la base de datos, así que en ese momento puedes usar la misma llamada, y no tiene trabajo extra. Si hay 3 conectados, lo tiras, si hay menos, lo conectas.

oFF-sIDE

No se trata de ver si hay 3 al mismo tiempo, sino de limitar 3 dispositivos. La misma persona ni siquiera debería poder hacer login al mismo tiempo o en distintos momentos, desde 4 dispositivos diferentes.

Es decir, llego yo hoy y me me identifico en el tablet y en el movil.
Mañana me identifico en el PC de casa.
Pasado mañana intento identificarme en el PC del trabajo y me debe impedir el acceso.

Me da igual si el acceso es simultáneo o no. Lo que no quiero es que puedas acceder desde más de 3 dispositivos. Por eso lo de meterle una semilla en el localstorage del navegador, para que sea el dispositivo el que quede registrado y no la sesión.

1 respuesta
cabron

#14

Pero es que para hacer eso no te compliques la vida y usa cookies.

Se pueden borrar, se pueden deshabilitar, exáctamente igual que el local store, así que no ganas nada usando local store en lugar de cookies.

1 1 respuesta
oFF-sIDE

#15 Sí, en el fondo viene a ser lo mismo. La diferencia es que las cookies se borran al vaciar la caché del navegador y el localstorage no. Por eso pienso que el localstorage me viene mejor.

O

No entiendo la necesidad de solo permitir 3 dispositivos diferentes pero con solo 1 conexión a la vez.
Esto como se tratara? Quien añade los dispositivos que se pueden utilizar? Y en caso de llegar al máximo?
El localStorage solo lo veo útil si tu Web trabaja con una API REST de la otra forma utilizaría cookies.

1 respuesta
Soltrac

Lo que quieres hacer no se puede hacer sin hacer nada client side. No te comas la cabeza, no hace falta ser un hacker para saltarse cualquier restricción de este tipo server side (y client side, pero ya para eso necesitas saber más). Por supuesto, cuando me refiero server side me refiero a nada más que no sea un navegador. Si ya usas un applet de java o cualquier mierda ya tienes más libertad.

1 respuesta
oFF-sIDE

#17 Pues es muy simple. Si un usuario hace login y reproducir, por ejemplo, un disco de música porque lo compró en su momento, no quiero que todos sus colegas se conecten a su cuenta y puedan reproducir todos el disco. Con una limitación de 3 dispositivos me parece suficiente para un uso "legal".

#18 Eso es lo que me temía. En fin, propondré la opción del localstorage y ya que el cliente decida.

Gracias a todos por vuestras aportaciones.

1 respuesta
O

#17 Yo si compro una suscripción o lo que sea de un cd de música espero poder reproducirlo donde y cuando quiera. Si me limitan a 3 dispositivos es una putada.
Es como si yo compro un cd y no se lo puedo dejar a un colega para que lo escuche(obviamente no podríamos a la vez).
Le vería sentido si tuvieras conexiones simultaneas pero como has comentado eso no será posible.
Pero bueno no soy nadie para meterme con el modelo de negocio sin tener el suficiente conocimiento

Suerte con el proyecto!

eXtreM3

#19 lo de los 3 dispositivos y música tiene algo que ver con Spotify? Lo digo porque ellos utilizan el mismo sistema. Si eres premium puedes tener listas offline solo en 3 dispositivos, si conectas un 4º dispositivo las listas offline se te borra de 1 de los otros 3 dispositivos anteriores.

Con JS me parece que se puede obtener la MAC de un dispositivo, eso es como los bastidores de los coches no? Sería tu solución, creo.

1 respuesta
MTX_Anubis

#21 En dispositivos tienes una app no el navegador y no lo hace por la app si no por un identificador unico de cada movil (imagino que es esto) a parte de que es muy fácil idear cualquier sistema de estos si tienes una app en la que tienes que logearte. Además puedes usar tantos dispositivos como te de la gana la limitación está en las listas offline. Desde JS a pelo no se puede conseguir la MAC que yo sepa. En caso de que pudieras, qué MAC coges? La de la tarjeta de red, la de la placa base, la del procesador, ram, etc. xD

El problema que plantea #1 es desde el navegador, a parte de que me parece injusto que una persona no pueda meterse en una web a escuchar música pero bueno. Yo antes que ese límite pondría sistema de checkeo que marcara como sospechosos a los usuarios y los avisara, solo poder estar logeado 1 vez a la misma vez y cosas similares.

Vamos que me logeo desde el movil y dos pcs y me jodo xD

2 respuestas
eXtreM3

#22 ejecutando un applet de java se podría acceder a esos datos exclusivos de cada dispositivo?

RaymaN

Yo coincido con #22 en que es un coñazo lo que estás planeando. Si quieres controlar los abusos, espera a que se produzcan. Quizá nunca ocurran y el usuario se moleste por las limitaciones, impidiendo el crecimiento de tu servicio.

Lo que puedes hacer es ir guardando un historial de IPs y user-agent del usuario. Si detectas que algún usuario tiene muchas IPs asociadas con distintos user-agents puede que esté compartiendo la cuenta. Solo entonces deberías actuar.

2 respuestas
oFF-sIDE

Lo de escuchar música era un ejemplo eh jaja.

En este caso son descargas de libros. Capar dispositivos es un requerimiento del cliente, no mío.

Lo de acumulación de IPs y user-agents lo había pensado como una segunda capa de seguridad. En fin, ya veremos porque hoy me he reunido y no le ha convencido mucho el asunto :/

eXtreM3

#24 si realmente es un problema que haya más de 3 dispositivos no esperaría a que se produjera el problema para atajarlo.

r2d2rigo

Y meterle DRM a los libros para quitarte el problema de encima a la hora de distribuirlos? Porque en cuanto se baje una copia va a rular rapida por el torrent si el usuario quiere.

gohrum

#24 IP e user agent son flags que se pueden editar de forma muy sencilla por el cliente de la web, ya sea mediante un proxy para las IPs, o con modificando las user agent en el propio navegador.

Mi propuesta para #1 es o bien un límite de acceso al contenido por cuenta. o bien almacenar cookie / session / localhost / websql en la maquina y permitir solamente el acceso a clientes con esa información. El punto negativo es que esa información en cliente es altamente volátil.

Si cliente que accede no tiene la cookie (le diremos cookie, pero puede ser lo que quieras de lo anterior), lo generas y te acuerdas de ello. en cuanto hayas generado tres o las que quieras, bloqueas el acceso a la cuenta y permites solamente el acceso a las tres primeras keys generadas.

Si el usuario es un retarded y ha reiniciado cache y datos locales multiples veces, entonces que se ponga en contacto con vosotros. Si ha compartido cuenta contactará una vez, no dos.

Usuarios habituales