2013-05-10 14 views
6

cookieParser() ci dà la possibilità di firmare i cookie con una frase segreta, che è ottima per evitare manomissioni. Comprendo che un cookie è firmato con un valore speciale, per evitare manomissioni.Utilizzo di cookieParser() e cookieSession() insieme?

Ho appena scoperto cookieSession(), che trovo ad essere un grande alternativa ai cookie archiviate su server (I memorizzare solo { loggedIn = true, userId=763487246824632}, che non cresce mai).

Ma ... ho scoperto che l'impostazione di un "segreto" per cookieParser() rompe le cose, e cookieSession() smette di funzionare se la frase segreta corrisponde. La ragione sembra essere che se il cookie è firmato usando lo stesso segreto, allora cookieParser() lo prende e lo analizza. La cosa strana è che, una volta cookieParser() ha fatto il suo lavoro, e con la stessa firma segreta, la sessione è impostata su:

{ cookie: 
    { path: '/', 
    _expires: null, 
    originalMaxAge: null, 
    httpOnly: true } } 

Piuttosto che:

{ testing: 'OOO' } 

(Ogni ricarica aggiunge un 'o') Quindi ...

  • La mia analisi ha funzionato correttamente?
  • Sapete perché la sessione è impostata su quello strano oggetto { cookie se le frasi segrete corrispondono?

Merc.

risposta

10

L'analisi è corretta, posso riprodurla.

Il problema è causato da this line nel cookieSession middleware (qualche contesto: options.secret è la chiave passata a cookieSession, req.secret è la chiave passata a cookieParser): se si passa entrambi middleware una chiave segreta, cookieSession presuppone che troverà il cookie raw (non analizzato) in req.cookies.

Ma dal momento che cookieParser ha raccolto anche il cookie firmato (ed è in esecuzione prima dello cookieSession), ha analizzato il cookie stesso (e poiché le chiavi di firma erano uguali, è riuscito a farlo), lo ha memorizzato in req.signedCookiese cancellato da req.cookies. Quindi per quanto riguarda lo cookieSession, il cookie non è impostato.

L'oggetto che vedete è il contenuto della sessione di default (che è di proprietà cookie dalla configurazione cookieSession):

app.use(express.cookieSession({ 
    cookie : { // <-- this object 
    ... 
    } 
}); 

Per quanto riguarda una soluzione: utilizzare una chiave diversa per ogni middleware, o semplicemente trascorrere una di loro la tua chiave segreta, ma non entrambe (con la consapevolezza che se la passi a cookieParser, tutti i i tuoi cookie saranno firmati).

FWIW: Non sono del tutto sicuro se questo è un bug reale. È una conseguenza dell'uso dello stesso meccanismo di firma per entrambi gli standard cookieParser e cookieSession, senza distinzione tra i cookie firmati da uno o l'altro.Anche se potrebbe essere risolto controllando sempre se il cookie si trova in req.signedCookies.

+1

Che risposta fantastica e completa. So che è un problema piuttosto di nicchia, ma merita +1 - grazie! – Merc

Problemi correlati