web-dev-qa-db-fra.com

Que sont les cookies "signés" dans connect / expressjs?

J'essaie de comprendre ce que sont les "cookies signés". Il n'y a pas grand chose sur le net, et si j'essaye ceci:

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

Mais quand même ... Les cookies sont toujours normaux sur le navigateur, et je ne sais pas vraiment ce qui est "signé" (j'espérais en quelque sorte "voir" quelque chose de bizarre sur le client, comme les données chiffrées à l'aide de "Un secret" comme du sel?)

La documentation indique ( https://github.com/expressjs/cookie-parser ):

Parse Cookie en-tête et peupler req.cookies avec un objet associé aux noms de cookie. Vous pouvez éventuellement activer la prise en charge des cookies signés en transmettant une chaîne secret, qui assigne req.secret il peut donc être utilisé par d’autres middlewares.

Est-ce que quelqu'un sait?

Merc.

95
Merc

Le cookie sera toujours visible, mais sa signature permettra de détecter si le client a modifié le cookie.

Cela fonctionne en créant un HMAC de la valeur (cookie actuel) et en le codant en base64. Lorsque le cookie est lu, il recalcule la signature et s'assure qu'il correspond à la signature qui lui est attachée.

Si cela ne correspond pas, il y aura une erreur.

Si vous souhaitez également masquer le contenu du cookie, vous devez plutôt le chiffrer (ou simplement le stocker dans la session côté serveur). Je ne sais pas s'il existe déjà un middleware pour cela.

Éditer

Et pour créer un cookie signé, vous utiliseriez

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

Et pour accéder à un cookie signé, utilisez l'objet signedCookies de req:

req.signedCookies['name']
110
staackuser2

Yup comme emostar mentionne qu'il s'agit simplement de s'assurer qu'une valeur n'a pas été falsifiée. Il est placé dans un objet différent (req.signedCookies) pour différencier les deux, ce qui permet au développeur de montrer l'intention. S'ils étaient stockés dans des cookies de demande avec les autres, quelqu'un pourrait simplement créer un cookie non signé du même nom, ce qui irait à l'encontre de leur objectif.

23
TJ Holowaychuk

J'ai cherché assez longuement pour une bonne réponse à cela ... Et en regardant le code source de cookie-signature, qui est utilisé par cookie-parser signer les cookies signés m'a permis de mieux comprendre ce qu'est un cookie signé.

val est bien sûr la valeur du cookie, et secret est la chaîne que vous ajoutez comme option à cookie-parser

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

11
Anders Östman

J'ai utilisé la version 1.4.4 de cookie-parser.

Je pourrais ajouter des cookies signés et des cookies signés cryptés dans le navigateur. Si j'essaie de modifier les cookies signés à l'aide de editThisCookie (plug-in chrome), l'analyseur de cookie détecte les modifications externes, puis définit false comme valeur.

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

En-tête de réponse dans le navigateur, apparaître comme

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

Obtenir un cookie signé

request.signedCookies

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

0
Dinesh