Quale richiesta di cookie è una richiesta sospetta?

1

Ho questa tabella che contiene tutti i cookie degli utenti: (riguardo l'accesso. che in realtà è "ricordami di averlo controllato")

// cookies
+----+---------+-------------------+------------+
| id | user_id |       token       |   expire   |
+----+---------+-------------------+------------+
| 1  | 32423   | dki3j4rf9u3e40... | 1467586386 |
| 2  | 65734   | erhj5473fv34gv... | 1467586521 |
| 3  | 21432   | 8u34ijf34t43gf... | 1467586640 |
+----+---------+-------------------+------------+

E controllo entrambe le colonne user_id e token per convalidare un cookie:

SELECT 1
FROM cookies
WHERE user_id = :id AND
      token   = :token

Bene, ci sono 5 casi:

  1. riga esiste
  2. la riga non esiste perché user_id = :id è falso
  3. la riga non esiste perché token = :token è falso
  4. la riga non esiste perché sia user_id = :id che token = :token sono false
  5. la riga non esiste perché user_id = :id e token = :token sono true ma non nella stessa riga.

La mia domanda: quale caso è pericoloso e devo preoccuparmene? Quale non è importante e devo ignorarlo?

Ok, e questa teoria? "Non è necessario controllare la colonna user_id :"

SELECT 1
FROM cookies
WHERE token = :token

Quindi ci sono solo due casi:

  1. riga esiste
  2. la riga non esiste perché token = :token è falso

E poi niente di sospetto. Quindi questa teoria è buona (sicuro) ?

    
posta stack 04.07.2016 - 01:26
fonte

2 risposte

1

Se assicuri che il tuo token contenga abbastanza entropia (> 128 bit), allora non dovresti controllare anche l'ID utente.

Vorrei anche archiviare l'hash del token all'interno del tuo database usando qualcosa di altrettanto sicuro di SHA-2, in questo modo se la tua tabella remember-me è compromessa in qualsiasi modo, un utente malintenzionato non può dirottare le sessioni. Il set di cookie sul client dovrebbe essere il valore grezzo. Nota che il sale non è necessario per valori casuali sufficientemente forti.

    
risposta data 04.07.2016 - 09:59
fonte
2

Se hai scelto un CSPRNG sufficientemente grande per il token, controllarlo dovrebbe essere sufficiente. Dovrebbe essere sufficiente da qualche parte nella dimensione da 128 a 256 bit.

Non menzioni dove stai memorizzando il token nel browser dell'utente. I cookie sono in genere utilizzati per questo. Dovresti avere l'impostazione Proteggi e HttpOnly sul cookie. Fondamentalmente, dovresti prendere precauzioni di sicurezza simili a sicurezza per un cookie di sessione .

Per non trovare una riga corrispondente nel database, non è necessariamente un problema. Ad esempio, una riga potrebbe mancare perché il tuo sito l'ha cancellato perché è molto vecchio. La preoccupazione per la sicurezza sarebbe se qualcuno sta cercando di cercare tra i token per trovarne uno valido. Puoi semplicemente contare sulla probabilità di rendere impossibile ciò assicurandoti di scegliere token sufficientemente lunghi e casuali.

    
risposta data 04.07.2016 - 03:06
fonte

Leggi altre domande sui tag