2012-08-10 7 views
73

Estoy intentando averiguar qué son en realidad las "cookies firmadas". no hay mucho en la red, y si intento esto:¿Qué son las cookies "firmadas" en connect/expressjs?

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

Pero aún así ... Las cookies son todavía 100% normales en el navegador, y no se sabe muy bien qué "firmado" es aquí (? yo era una especie de esperanza de "ver" algo de extrañeza en el cliente, algo así como los datos cifrados utilizando "Un secreto" como la sal)

la documentación dice (https://github.com/expressjs/cookie-parser):

Analizar Cookie encabezado y poblar req.cookies con un objeto marcado por los nombres de las cookies. Opcionalmente, , puede habilitar el soporte de cookies firmado pasando una cadena secret, que asigna req.secret por lo que puede ser utilizado por otro middleware.

¿Alguien sabe?

Merc.

Respuesta

79

La cookie seguirá estando visible, pero tiene una firma, por lo que puede detectar si el cliente modificó la cookie.

Funciona mediante la creación de un HMAC del valor (cookie actual), y base64 lo codificó. Cuando se lee la cookie, vuelve a calcular la firma y se asegura de que coincida con la firma adjunta.

Si no coincide, se mostrará un error.

Si también desea ocultar el contenido de la cookie, debe cifrarlo en su lugar (o simplemente almacenarlo en la sesión del lado del servidor). No estoy seguro de si hay middleware para eso ya o no.

Editar

Y para crear una cookie firmado usaría

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

y para acceder a una cookie firmado utilizar el signedCookies objeto de req:

req.signedCookies['name'] 
+0

Gracias! Pero ... No veo la firma adjunta a la cookie en este momento. Es decir, en el cliente, la cookie está allí sin una firma. ¿Hay algo que deba hacer para habilitar la firma de cookies, aparte de incluir el mensaje secreto en 'express.cookieParser()'? – Merc

+0

Espera ... Estoy configurando las cookies con 'res.cookie ('somethingElseAgainAndAgain', 'signed? Maybe');' pero ... ¡dudo que sea por firmarlo! El middleware cookieParser() está listo para analizar las cookies firmadas, pero definitivamente no estoy haciendo la configuración correcta ... ¿Tengo que firmarlas manualmente ...? – Merc

+0

Eso sería todo lo que se necesita, tal vez su cookie es de antes de agregar el secreto? Prueba a quitar la galleta para ver si eso lo pone en marcha. – staackuser2

16

Sip como emostar menciona que es simplemente para asegurar que un valor no haya sido manipulado. Se coloca en un objeto diferente (req.signedCookies) para diferenciar entre los dos, permitiendo que el desarrollador muestre la intención. Si estuvieran almacenados en req.cookies junto con los demás, alguien podría simplemente crear una cookie sin firma con el mismo nombre, derrotando todo el propósito de ellos.

8

He estado buscando bastante extensa para una buena respuesta a esta ... Y mirar el código fuente de cookie-signature, que es utilizado por cookie-parser a firmar las galletas firmados me han dado una mejor comprensión de lo que una cookie firmado es.

val es, por supuesto, el valor de la cookie, y secret es la cadena se agrega como opción de cookie-parser

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

+2

Aquí hay un enlace canónico conservado: https://github.com/tj/node-cookie-signature/blob/60f3be29232145e445aada51d520d370b0a52161/index.js#L16 –

+0

Leer el código fue de hecho una explicación mucho mejor. ¡Gracias! –

Cuestiones relacionadas