¿Por qué no tener una cookie de sesión idéntica para dispositivos de diferentes usuarios?

0

Aquí está mi estructura de tabla:

// users
+----+--------+------------------------+------------------+-------------------------------+
| id |  name  |          email         |     cookie       |    /* some other columns */   |
+----+--------+------------------------+------------------+-------------------------------|
| 1  | Jack   | [email protected]   | ojer0f934mf2...  |                               |
| 2  | Peter  | [email protected]     | ko4398f43043...  |                               |
| 3  | John   | [email protected]   | 0243hfd348i4...  |                               |
+----+--------+------------------------+------------------+-------------------------------+

La columna cookie contiene una cadena (la cookie que mantiene al usuario conectado) que también se establece en los dispositivos del usuario. Como puede ver, solo tengo una cadena una (como cookie) para cada usuario. Así que todos los dispositivos de los usuarios tienen una cookie idéntica.

La mayoría de los programadores profesionales me dicen:

  

Sería más seguro si cada dispositivo tuviera su propia cookie (la cookie de cada dispositivo debería ser diferente de la cookie de otros dispositivos, no una cookie constante para todos los dispositivos)

Bueno, ¿por qué? ¿Qué tiene de malo tener una cookie idéntica para todos los dispositivos? Además, como ve, solo tengo un registro para la cookie en la base de datos. Entonces, si actualizo ese registro para un nuevo dispositivo, se desconectará el (los) dispositivo (s) anterior (es).

EDITAR: Imagina el siguiente escenario (basado en diferentes cookies para diferentes dispositivos):

Alice inicia sesión en mi sitio en su computadora en casa y permanece conectada. Más tarde, también inicia sesión en una computadora en la escuela y no cierra sesión cuando termina, pero se olvida de cerrar sesión. Ella se va a casa y quiere cerrar sesión de su cuenta en la escuela. ¿Cómo puede ella hacer eso?

    
pregunta stack 27.06.2016 - 16:29
fuente

2 respuestas

4

El problema

Imagine el siguiente escenario: Alice inicia sesión en su sitio en su computadora en su casa y permanece conectada. Más tarde, también inicia sesión en una computadora en la escuela, pero cierra la sesión cuando termina. ¿Qué pasa cuando llega a casa?

Para que este sistema funcione, deberías configurar la columna cookie en NULL al cerrar sesión. Pero eso la desconectaría de todos los dispositivos. Eso sería muy molesto si, por ejemplo, desea permanecer conectado continuamente en su teléfono. Por lo tanto, siempre que invalide el lado del servidor de sesiones al cerrar la sesión (siempre debe hacer eso) esto es más un problema de usabilidad que de seguridad.

Solución # 1

Entonces, ¿cómo se vería tu estructura de tabla si permitieras varias sesiones por usuario? Primero, elimine la columna cookie de la tabla users . Luego cree una nueva tabla llamada sessions como esto:

+------+------------------+
| user |     cookie       |
+------+------------------+
| 1    | ojer0f934mf2...  |
| 2    | ko4398f43043...  |
| 2    | 34fjkg3j438t...  |
| 3    | 0243hfd348i4...  |
+------+------------------+

Tenga en cuenta que el segundo usuario tiene dos sesiones activas diferentes.

También debería haber una marca de tiempo en algún lugar, para que pueda terminar la sesión después de X horas. Incluso si tiene una duración máxima en la cookie, siempre debe terminar las sesiones del lado del servidor para mitigar los efectos del robo de sesión.

Solución # 2

No es necesario almacenar identificadores de sesión en una base de datos. Simplemente use el PHP integrado en manejo de sesiones y no tendrá que preocuparse por generar ID, configurar cookies, etc.

Cerrar sesión desde diferentes dispositivos

En cuanto a su edición sobre cómo dejar que Alice cierre la sesión en la escuela si se olvidó de hacerlo: incluya una función que le permita salir de todos los dispositivos. Facebook, por ejemplo, tiene una característica como esa . O si no quiere gastar energía implementando eso, simplemente ordene a los usuarios que cambien su contraseña: una función de restablecimiento de contraseña bien implementada debería terminar todas las sesiones activas de los usuarios de todos modos.

En la configuración de la base de datos, terminar todas las sesiones sería equivalente a ejecutar esto:

DELETE FROM sessions WHERE user = :id
    
respondido por el Anders 27.06.2016 - 16:57
fuente
1

Porque es más fácil usar un ataque de secuestro de sesión ...

Más información al respecto aquí enlace

    
respondido por el Solrac 27.06.2016 - 16:37
fuente

Lea otras preguntas en las etiquetas