Red de conocimiento informático - Material del sitio web - Cómo utilizar el middleware analizador de cookies en Express

Cómo utilizar el middleware analizador de cookies en Express

Este artículo proporciona un análisis en profundidad del ejemplo de implementación del middleware analizador de cookies en Express y ahora lo comparte con usted para su referencia.

Introducción del artículo cookie-parser es el middleware de Express, que se utiliza para implementar el análisis de cookies y es uno de los middleware integrados en el andamiaje oficial.

Es muy sencillo de utilizar, pero ocasionalmente encontrarás problemas durante su uso. Esto suele deberse a una falta de comprensión de los mecanismos de firma y verificación del analizador de cookies Express.

Este artículo proporcionará una explicación detallada del mecanismo de implementación de firma y verificación del analizador de cookies Express y cómo la firma de cookies mejora la seguridad del sitio web.

Este artículo está sincronizado con la serie de temas de GitHub "Notas de aprendizaje de Nodejs"

Ejemplo inicial: configuración y análisis de cookies Primero, veamos el ejemplo más simple para comprender cómo usar el Analizador de cookies de configuración predeterminada.

Establecer cookies: utilice el método integrado de Express res.cookie().

Análisis de cookies: utilice middleware analizador de cookies.

var express = require('express');

var cookieParser = require('cookie-parser');

var app = express();

app.use( cookieParser());

app.use(function (req, res, next) {

console.log(req.cookies .nick); // Segundo acceso, salida chyingp

next();

});

app.use(function (req, res, next). ) {

res.cookie('nick', 'chyingp');

res.end('ok')

}); p>

app.listen(3000)use(function (req, res, next) {

req.cookies = cookie.parse(req.headers.cookies);

next();

}); Ejemplo avanzado: firma y análisis de cookies Por razones de seguridad, normalmente necesitamos firmar cookies.

El ejemplo se reescribe de la siguiente manera, con algunas advertencias:

Al inicializar cookieParser, ingrese secret como clave de firma.

Al configurar una cookie, configúrela signada en verdadero para que la cookie que se establecerá esté firmada.

Para obtener cookies, puede pasar req.cookies o req.signedCookies.

var express = require('express');

var cookieParser = require('cookie-parser');

var app = express();

//Inicializa el middleware, pasando el primer parámetro es el texto cifrado cifrado

app.p> // Pasando el tercer parámetro {signed: true} para indicar la cookie. ser digerido

res.cookie('nick', 'chyingp', {signed: true}

res.end('ok'); >});

aplicación. listening(3000) El valor de la cookie antes de firmar es chyingp, el valor de la cookie después de firmar es s3Achyingp.uVofnk6k2B9mHQpdPlQeOfjM8B5oa6mppny9d2BmG9rD0 y el valor de la cookie decodificada es s: chyingp.uVofnk6k 9mHQpdPlQeOfjM8B5oa6mppny9d mG9rD; 0.

A continuación se explica cómo se implementa la firma y el análisis de cookies.

La implementación de la firma y verificación de cookies se implementa perfilando Express para completar la firma del valor de la cookie y cookie-parser para implementar el análisis de la firma de la cookie. Ambos *** usan la misma clave secreta.

Firma de cookies

Todas las configuraciones de cookies de Express (incluidas las firmas) se implementan mediante el método res.cookie().

El código simplificado es el siguiente:

res.cookie = function (nombre, valor, opciones) {

var secret = this.req.secret;

var firmado = opts.signed;

Si se utiliza options.signed como firma, se utilizará para firmar la cookie. p> // Si options.signed es verdadero, firma la cookie

if (signed) {

val = 's:' sign(val, secret);

}

this.append('Set-Cookie', cookie. cookie.serialize(nombre, String(val), opts));

devuelve esto

p> p>

}; signo es la función de firma. El pseudocódigo es el siguiente, que en realidad une el valor original de la cookie con el valor después de hmac.

Énfasis: Las cookies firmadas contienen valores originales.

función signo (val, secreto) {

return val '.' hmac(val, secreto);

} ¿De dónde viene el secreto? Se pasa cuando se inicializa el analizador de cookies.

El siguiente es un pseudocódigo:

var cookieParser = function (secret) {

return function (req, res, next) {

req.secret = secret ;

// ...

siguiente();

}

}; use(cookieParser('secret')); Análisis de cookies firmadas

Al comprender el mecanismo de firma de cookies, podrá saber claramente cómo "analizar" las cookies firmadas. En esta etapa, el middleware hace principalmente dos cosas:

Extraer el valor original correspondiente a la cookie firmada

Verificar si la cookie firmada es legal

La implementación El código es el siguiente:

// str: después de firmar la cookie, como "s:chyingp.uVofnk6k". 9mHQpdPlQeOfjM8B5oa6mppny9d mG9rD0"

// secreto: clave, como "secreto"

función signedCookie(str, secret) {

// Comprobar si se usa s : al principio para garantizar que solo se analicen las cookies firmadas

if (str.substr(0, 2) !== 's:'){

return str;

}

// Verifica si el valor de la firma es legal. Si es legal, devuelve verdadero; de lo contrario, devuelve falso

var val = unsign(str.slice( 2), secreto);

p>

if (val ! == false) {

Devolver val

}

Devolver; false;

} Determinar y extraer el valor de la cookie original es relativamente simple. Solo el nombre del método para cancelar la firma es confuso.

En general, solo la validez de la firma. está marcado y no hay contrafirma. p>El código para el método de cancelar firma es el siguiente:

Primero, extraiga el valor original A1 y el valor de firma B1 del valor de la cookie entrante.

En segundo lugar, utilice el mismo par de claves A1. Firme y luego obtenga A2.

Finalmente, determine si la firma es legal en función de la equivalencia de A2 y B1. exports.unsign = function(val, secret){

var str = val.slice(0, val.lastIndexOf('.'))

, mac = exports.sign( str, secret);

return sha1 (mac) == sha1(val) ? str: false

}; manipulación de cookies y mejora de la seguridad

Veamos un pequeño ejemplo de cómo las firmas de cookies pueden ser a prueba de manipulaciones

A partir del ejemplo anterior, supongamos que un sitio web utiliza un apodo de cookie para. identificar al usuario actualmente conectado.

En el ejemplo anterior, el valor de nick de la cookie del usuario que inició sesión es el siguiente: (después de decodificar)

s: chyingp.uVofnk6k 9mHQpdPlQeOfjM8B5oa6mppny9d mG9rD0

En este momento, alguien está intentando para modificar el valor del nick de la cookie para lograr el propósito de falsificación de identidad. Por ejemplo, se modificó a xiaoming:

s: xiaoming.uVofnk6k 9mHQpdPlQeOfjM8B5oa6mppny9d mG9rD0

Cuando el sitio web recibió una solicitud para analizar una cookie firmada, se descubrió que la verificación de la firma falló. . Esto confirma que la cookie es falsa.

hmac("xiaoming", "secreto")! == "uVofnk6k 9mHQpdPlQeOfjM8B5oa6mppny9d mG9rD0"

¿La firma garantiza la seguridad? Por supuesto que no.

En el ejemplo de la sección anterior, el valor del nick de la cookie por sí solo determina qué usuario inicia sesión, lo cual es un diseño muy pobre. Si bien es difícil falsificar una cookie firmada cuando se desconoce la clave secreta, la firma será la misma si el nombre de usuario es el mismo. En este caso, la falsificación es realmente muy fácil.

Lo anterior es el contenido que he recopilado para usted. Espero que le resulte útil en su trabajo futuro.

Artículos relacionados:

Comunicación del componente Vue (tutorial detallado)

Análisis detallado del código fuente de Vue Socket.io

Uso de implementación local de JavaScript Efecto lupa