Cosa sono i cookie “firmati” in connect / expressjs?


114

Sto cercando di capire cosa siano effettivamente i "cookies firmati". Non c'è molto in rete e se provo questo:

app.use(express.cookieParser('A secret'));

Ma ancora ... I cookie sono ancora normali al 100% sul browser, e non so davvero cosa sia "firmato" qui (speravo un po 'di "vedere" alcune stranezze sul client, qualcosa come i dati crittografati usando "Un segreto" come il sale?)

La documentazione dice ( https://github.com/expressjs/cookie-parser ):

Analizza l' intestazione del cookie e compila req.cookies un oggetto con chiave dai nomi dei cookie. Facoltativamente è possibile abilitare il supporto dei cookie firmati passando una secretstringa, che assegna in req.secretmodo che possa essere utilizzato da altri middleware.

Qualcuno sa?

Merc.

Risposte:


135

Il cookie sarà ancora visibile, ma ha una firma, quindi può rilevare se il client ha modificato il cookie.

Funziona creando un HMAC del valore (cookie corrente) e lo ha codificato in base64. Quando il cookie viene letto, ricalcola la firma e si assicura che corrisponda alla firma ad esso allegata.

Se non corrisponde, verrà visualizzato un errore.

Se vuoi nascondere anche il contenuto del cookie, dovresti invece crittografarlo (o semplicemente memorizzarlo nella sessione lato server). Non sono sicuro che esista un middleware per quello già disponibile oppure no.

modificare

E per creare un cookie firmato che useresti

res.cookie('name', 'value', {signed: true})

E per accedere a un cookie firmato utilizzare l' signedCookiesoggetto di req:

req.signedCookies['name']

Grazie! Ma ... al momento non vedo la firma apposta al cookie. Cioè, nel client il cookie è lì senza una firma. C'è qualcosa che devo fare per abilitare la registrazione del cookie, oltre a includere il messaggio segreto express.cookieParser()?
Merc

Aspetta ... sto impostando i biscotti con res.cookie('somethingElseAgainAndAgain', 'signed? Maybe' );ma ... dubito che lo firmi! Il middleware cookieParser () è pronto per analizzare i cookie firmati, ma sicuramente non sto facendo l'impostazione corretta ... devo firmarli manualmente ...?
Merc

6
E 'stato: (res.cookie(name, value, { signed: true })). Segnalazione del "dettaglio" mancante dalla documentazione ...
Merc

6
Il dirottamento di una sessione è qualcosa di diverso ... ovvero l'utente B prende l'identità dell'utente A. I cookie firmati sono solo un modo per verificare che i contenuti del cookie non siano stati modificati dall'utente, quindi i contenuti possono essere considerati attendibili.
staackuser2

9
Vale la pena menzionare If it does not match, then it will give an error.Non è un errore . Solo request.signedCookie per quella chiave non è impostato . Quindi più come ignorato
basarat

25

Sì, come emostar afferma che è semplicemente per garantire che un valore non sia stato manomesso. È posizionato in un oggetto diverso (req.signedCookies) per distinguere tra i due, consentendo allo sviluppatore di mostrare l'intento. Se fossero archiviati in req.cookies insieme agli altri, qualcuno potrebbe semplicemente creare un cookie non firmato con lo stesso nome, vanificandone l'intero scopo.


11

Ho cercato in modo abbastanza approfondito una buona risposta a questo ... E guardando il codice sorgente di cookie-signature, che viene utilizzato da cookie-parserper firmare i cookie firmati, mi ha dato una migliore comprensione di cosa sia un cookie firmato.

valè ovviamente il valore del cookie ed secretè la stringa a cui aggiungi come opzione cookie-parser

https://github.com/visionmedia/node-cookie-signature/blob/master/index.js#L16


3
Ecco un collegamento canonico conservato: github.com/tj/node-cookie-signature/blob/…

Leggere il codice è stata davvero una spiegazione molto migliore. Grazie!

0

Ho usato la versione 1.4.4 del cookie-parser.

Potrei aggiungere cookie firmati e cookie firmati crittografati nel browser, se provo a modificare i cookie firmati utilizzando editThisCookie (plugin di Chrome), il parser dei cookie rileva la modifica esterna e quindi imposta false come valore.

response.cookie('userId',401,{signed: true})

L'intestazione della risposta nel browser appare come

Set-Cookie: empId=s%3A101.US2oSV4TSvfkvvEQ5fj1sXsjj8rNxx2ph4VdHNTuKX8; Path=/

Ottieni cookie firmato

request.signedCookies

https://gist.github.com/dineshbalaji/607d166f0240f932a5cb02099b0ece4c

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.