Was sind "signierte" Cookies in connect / expressjs?

113

Ich versuche herauszufinden, was "signierte Cookies" eigentlich sind. Es gibt nicht viel im Netz, und wenn ich das versuche:

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

Aber trotzdem ... Cookies sind im Browser immer noch zu 100% normal, und ich weiß nicht wirklich, was "signiert" hier ist (ich hatte gehofft, auf dem Client etwas Seltsames zu "sehen", so etwas wie die mit verschlüsselten Daten "Ein Geheimnis" als Salz?)

In der Dokumentation heißt es ( https://github.com/expressjs/cookie-parser ):

Analysieren Sie den Cookie- Header und füllen Sie ihn req.cookies mit einem Objekt, das durch die Cookie-Namen gekennzeichnet ist. Optional können Sie die Unterstützung für signierte Cookies aktivieren, indem Sie eine secretZeichenfolge übergeben, die zugewiesen wird, req.secretdamit sie von anderer Middleware verwendet werden kann.

Weiss es jemand?

Merc.

Merc
quelle

Antworten:

134

Das Cookie ist weiterhin sichtbar, verfügt jedoch über eine Signatur, sodass festgestellt werden kann, ob der Client das Cookie geändert hat.

Es funktioniert, indem ein HMAC mit dem Wert (aktuelles Cookie) erstellt und von base64 codiert wird. Wenn das Cookie gelesen wird, berechnet es die Signatur neu und stellt sicher, dass sie mit der angehängten Signatur übereinstimmt.

Wenn es nicht übereinstimmt, wird ein Fehler ausgegeben.

Wenn Sie auch den Inhalt des Cookies ausblenden möchten, sollten Sie ihn stattdessen verschlüsseln (oder einfach in der serverseitigen Sitzung speichern). Ich bin mir nicht sicher, ob es dafür bereits Middleware gibt oder nicht.

Bearbeiten

Und um ein signiertes Cookie zu erstellen, würden Sie verwenden

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

Um auf ein signiertes Cookie zuzugreifen, verwenden Sie das signedCookiesObjekt req:

req.signedCookies['name']
staackuser2
quelle
Vielen Dank! Aber ... ich sehe im Moment nicht die Signatur, die an den Cookie angehängt ist. Das heißt, im Client ist der Cookie ohne Signatur vorhanden. Muss ich etwas tun, um die Cookie-Signatur zu aktivieren, außer die geheime Nachricht einzuschließen express.cookieParser()?
Merc
Warte ... Ich setze die Cookies mit, res.cookie('somethingElseAgainAndAgain', 'signed? Maybe' );aber ... ich bezweifle, dass das unterschrieben wird! Die Middleware cookieParser () ist bereit, signierte Cookies zu analysieren, aber ich mache die Einstellung definitiv nicht richtig ... muss ich sie manuell signieren ...?
Merc
6
Es war : (res.cookie(name, value, { signed: true })). Meldung des fehlenden "Details" aus der Dokumentation ...
Merc
6
Das Entführen einer Sitzung ist etwas anderes ... nämlich, dass Benutzer B die Identität von Benutzer A annimmt. Signierte Cookies sind nur eine Möglichkeit, um zu überprüfen, ob der Inhalt des Cookies vom Benutzer nicht geändert wurde, sodass dem Inhalt vertraut werden kann.
staackuser2
9
Erwähnenswert If it does not match, then it will give an error.Kein Fehler . Nur die request.signedCookie für diesen Schlüssel ist nicht festgelegt . Also eher ignoriert
Basarat
25

Ja, wie Emostar erwähnt, ist es einfach sicherzustellen, dass ein Wert nicht manipuliert wurde. Es wird in einem anderen Objekt (req.signedCookies) platziert, um zwischen den beiden zu unterscheiden, sodass der Entwickler seine Absicht zeigen kann. Wenn sie zusammen mit den anderen in req.cookies gespeichert würden, könnte jemand einfach ein nicht signiertes Cookie mit demselben Namen erstellen und den gesamten Zweck von ihnen zunichte machen.

TJ Holowaychuk
quelle
11

Ich habe für eine gute Antwort auf diese ziemlich umfangreich gesucht ... und Blick auf den Quellcode cookie-signature, die von verwendet wird , cookie-parserdie signierten Cookies zu unterschreiben haben mir ein besseres Verständnis von dem, was ein signiertes Cookie ist.

valist natürlich der Wert des Cookies und secretdie Zeichenfolge, die Sie als Option hinzufügen cookie-parser

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

Anders Östman
quelle
3
Hier ist ein erhaltener kanonischer Link: github.com/tj/node-cookie-signature/blob/…
Das Lesen des Codes war in der Tat eine viel bessere Erklärung. Vielen Dank!
0

Ich habe den Cookie-Parser 1.4.4 verwendet.

Ich könnte signierte Cookies und signierte Cookies hinzufügen, die im Browser verschlüsselt sind. Wenn ich versuche, signierte Cookies mit editThisCookie (Chrome-Plugin) zu bearbeiten, erkennt der Cookie-Parser externe Änderungen und setzt dann false als Wert.

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

Der Antwortheader im Browser wird als angezeigt

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

Holen Sie sich signierte Cookie

request.signedCookies

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

Dinesh
quelle