Perché non hai un cookie di sessione identico per i diversi dispositivi dell'utente?

0

Ecco la mia struttura di tabella:

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

La colonna cookie contiene una stringa (il cookie che mantiene l'utente connesso) che è anche impostata nei dispositivi dell'utente. Come vedi, ho appena una stringa (come il cookie) per ogni utente. Quindi tutti i dispositivi dell'utente hanno un cookie identico.

La maggior parte dei programmatori professionisti mi dice:

It would be safer if each device had its own cookie (the cookie of each device should be different than the cookie of other devices, not a constant cookie for all devices)

Bene, perché? Cosa c'è di sbagliato nell'avere un cookie identico per tutti i dispositivi? Inoltre, come vedi, ho un solo record per il cookie nel database. Quindi, se aggiorno quel record per un nuovo dispositivo, i dispositivi precedenti verranno disconnessi.

EDIT: immagina il seguente scenario (basato su cookie diversi per dispositivi diversi):

Alice accede al mio sito sul suo computer a casa e rimane connesso. Successivamente accede anche a un computer a scuola, e non si disconnette quando ha finito, ma si dimentica di uscire. Torna a casa e vuole uscire dal suo account a scuola. Come può farlo?

    
posta stack 27.06.2016 - 16:29
fonte

2 risposte

4

Il problema

Immagina il seguente scenario: Alice accede al tuo sito sul suo computer a casa e rimane connesso. Successivamente accede anche a un computer a scuola, ma si disconnette quando ha finito. Che cosa succede quando torna a casa?

Per far funzionare questo sistema, è necessario impostare la colonna cookie su NULL al logout. Ma questo la disconnetterebbe da tutti i dispositivi. Sarebbe molto fastidioso se, ad esempio, volessi rimanere costantemente connesso al tuo telefono. Quindi, se in realtà invalidi sessioni lato server al logout (dovresti farlo sempre) questo è più un problema di usabilità che un problema di sicurezza.

Soluzione n. 1

Quindi, quale sarebbe la struttura della tabella se consentissi più sessioni per utente? Innanzitutto, elimina la colonna cookie dalla tabella users . Quindi crea una nuova tabella chiamata sessions come questa:

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

Si noti che il secondo utente ha due diverse sessioni attive.

Dovrebbe esserci un timestamp anche lì da qualche parte, in modo che tu possa terminare la sessione dopo X ore. Anche se hai un limite di età sul cookie, dovresti sempre terminare le sessioni lato server per mitigare gli effetti del session theaft.

Soluzione n. 2

Non è necessario memorizzare identificatori di sessione in un database. Utilizza semplicemente la gestione della sessione integrata in PHP e non dovrai preoccuparti di generare ID, impostare cookie, ecc.

Disconnessione da diversi dispositivi

Considera la tua modifica su come consentire ad Alice di uscire da scuola se ha dimenticato di farlo: includi una funzione che le consente di uscire da tutti i dispositivi. Facebook, ad esempio, ha una funzione del genere . O se non vuoi sprecare energia nell'implementazione di questo, basta chiedere agli utenti di cambiare la loro password - una funzione di reimpostazione della password ben implementata dovrebbe terminare comunque tutte le sessioni attive degli utenti.

Nell'impostazione del database, terminare tutte le sessioni equivale a eseguire questo:

DELETE FROM sessions WHERE user = :id
    
risposta data 27.06.2016 - 16:57
fonte
1

Perché è più facile usare un attacco di dirottamento di sessione ...

Maggiori informazioni qui link

    
risposta data 27.06.2016 - 16:37
fonte

Leggi altre domande sui tag