2012-08-10 6 views
73

Ich versuche herauszufinden, was "signierte Cookies" eigentlich sind. Es gibt im Netz nicht viel, und wenn ich versuche, dies:Was sind "signierte" Cookies in connect/expressjs?

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

Aber trotzdem ... Cookies sind auf dem Browser noch 100% normal, und ich weiß nicht wirklich, was „signiert“ ist hier (? ich irgendwie hatte gehofft, etwas Verrücktheit auf dem Client zu „sehen“, so etwas wie die verschlüsselten Daten „Ein Geheimnis“ als Salz verwendet wird)

die Dokumentation sagt (https://github.com/expressjs/cookie-parser):

Parse Cookie Header und bevölkern req.cookies mit einem Objekt, das durch die Cookie-Namen verschlüsselt wird. Optional können Sie signierte Cookie-Unterstützung aktivieren, indem Sie eine secret Zeichenfolge übergeben, die req.secret so es von anderen Middleware verwendet werden kann.

Weiß jemand?

Merc.

Antwort

79

Der Cookie ist weiterhin sichtbar, aber er hat eine Signatur, sodass er erkennen kann, ob der Client den Cookie geändert hat.

Es funktioniert durch Erstellen eines HMAC des Werts (aktuelle Cookie), und Base64 codiert es. Wenn der Cookie gelesen wird, berechnet er die Signatur neu und stellt sicher, dass sie mit der an sie angehängten Signatur übereinstimmt.

Wenn es nicht übereinstimmt, wird ein Fehler ausgegeben.

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

bearbeiten

Und ein signiertes Cookie erstellen Sie

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

Und für den Zugriff auf ein signiertes Cookie verwenden, um die signedCookies Objekt von req verwenden würde:

req.signedCookies['name'] 
+0

Dank! Aber ... Ich sehe im Moment nicht die Signatur, die an den Cookie angehängt ist. Das heißt, in dem Client ist der Cookie ohne Signatur vorhanden. Gibt es etwas, das ich tun muss, um die Cookie-Signatur zu aktivieren, außer die geheime Nachricht in 'express.cookieParser()' einzuschließen? – Merc

+0

Moment mal ... Ich setze die Cookies mit 'res.cookie ('somethingElseAgainAndAgain', 'signed? Maybe');' aber ... ich bezweifle, dass das signiert ist! Die cookieParser() Middleware ist dort bereit, um signierte Cookies zu parsen, aber ich mache definitiv nicht die richtige Einstellung ... muss ich sie manuell signieren ...? – Merc

+0

Das wäre alles was benötigt wird, vielleicht stammt Ihr Cookie von bevor Sie das Geheimnis hinzugefügt haben? Versuchen Sie, das Cookie zu entfernen, um zu sehen, ob es in Gang kommt. – staackuser2

16

Yup wie emostar erwähnt, es ist einfach sicherzustellen, dass ein Wert nicht manipuliert wurde. Es wird in ein anderes Objekt (req.signedCookies) platziert, um zwischen den beiden zu unterscheiden, sodass der Entwickler seine Absicht zeigen kann. Wenn sie zusammen mit den anderen in Keksen aufbewahrt würden, könnte jemand einfach einen unsignierten Keks mit dem gleichen Namen herstellen und den ganzen Zweck von ihnen besiegen.

8

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

val natürlich ist der Wert des Cookies und secret ist die Zeichenfolge, die Sie als Option in den cookie-parser

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

+2

Hier ist ein erhaltener kanonischer Link: https://github.com/tj/node-cookie-signature/blob/60f3be29232145e445aada51d520d370b0a52161/index.js#L16 –

+0

Das Lesen des Codes war in der Tat eine viel bessere Erklärung. Vielen Dank! –