Maison >interface Web >js tutoriel >Comment utiliser le middleware d'analyse de cookies dans Express
Cet article présente principalement une analyse approfondie de l'exemple d'implémentation du middleware Express cookie-analyser. Maintenant, je le partage avec vous et lui donne une référence.
cookie-parser est le middleware d'Express, utilisé pour analyser les cookies, et est l'un des middleware intégrés à celui de l'échafaudage officiel .
Il est très simple à utiliser, mais vous pouvez occasionnellement rencontrer des problèmes lors de son utilisation. Cela est généralement dû à un manque de compréhension des mécanismes de signature et de vérification d'Express + cookie-parser.
Cet article explique en profondeur le mécanisme de mise en œuvre de la signature et de la vérification d'Express + cookie-parser, et comment la signature des cookies améliore la sécurité du site Web.
La synchronisation du texte est incluse dans la série de thèmes GitHub « Nodejs Learning Notes »
Examinons d'abord l'utilisation de cookie-parser à partir de l'exemple le plus simple. La configuration par défaut est utilisée ici.
Paramètres des cookies : utilisez la méthode intégrée res.cookie() d'Express.
Analyse des cookies : utilisez le middleware d'analyse des 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); // 第二次访问,输出chyingp next(); }); app.use(function (req, res, next) { res.cookie('nick', 'chyingp'); res.end('ok'); }); app.listen(3000);
Dans le scénario actuel, le middleware cookie-analyser est grossièrement implémenté comme suit :
app.use(function (req, res, next) { req.cookies = cookie.parse(req.headers.cookie); next(); });
pour des raisons de sécurité, nous devons généralement signer les cookies.
L'exemple est réécrit comme suit, avec quelques points à noter :
Lorsque cookieParser est initialisé, passer en secret comme clé de signature.
Lors de la définition d'un cookie, définissez signé sur true pour signer le cookie qui est sur le point d'être défini.
Lors de l'obtention de cookies, vous pouvez les obtenir via req.cookies ou req.signedCookies.
var express = require('express'); var cookieParser = require('cookie-parser'); var app = express(); // 初始化中间件,传入的第一个参数为singed secret app.use(cookieParser('secret')); app.use(function (req, res, next) { console.log(req.cookies.nick); // chyingp console.log(req.signedCookies.nick); // chyingp next(); }); app.use(function (req, res, next) { // 传入第三个参数 {signed: true},表示要对cookie进行摘要计算 res.cookie('nick', 'chyingp', {signed: true}); res.end('ok'); }); app.listen(3000);
La valeur du cookie avant la signature est chyingp
, la valeur du cookie après la signature est s%3Achyingp.uVofnk6k%2B9mHQpdPlQeOfjM8B5oa6mppny9d%2BmG9rD0
et après décodage, elle est s:chyingp.uVofnk6k+9mHQpdPlQeOfjM8B5oa6mppny9d+mG9rD0
.
Analysons comment la signature et l'analyse des cookies sont mises en œuvre.
Express complète la signature des valeurs des cookies et cookie-parser implémente l'analyse des cookies signés. Les deux partagent la même clé secrète.
Signature des cookies
Les paramètres des cookies d'Express (y compris les signatures) sont tous implémentés via la méthode res.cookie().
Le code simplifié est le suivant :
res.cookie = function (name, value, options) { var secret = this.req.secret; var signed = opts.signed; // 如果 options.signed 为true,则对cookie进行签名 if (signed) { val = 's:' + sign(val, secret); } this.append('Set-Cookie', cookie.serialize(name, String(val), opts)); return this; };
sign est la fonction signature. Le pseudo-code est le suivant, qui concatène en fait la valeur d'origine du cookie avec la valeur après hmac.
Point important au tableau : la valeur du cookie signé inclut la valeur d'origine.
function sign (val, secret) { return val + '.' + hmac(val, secret); }
D'où vient le secret
ici ? Il est transmis lors de l'initialisation cookie-parser
. Comme le montre le pseudo-code suivant :
var cookieParser = function (secret) { return function (req, res, next) { req.secret = secret; // ... next(); }; }; app.use(cookieParser('secret'));
Analyse des cookies signés
Après avoir connu le mécanisme de signature des cookies, il est clair comment "analyser" le signé biscuit. A ce stade, le middleware fait principalement deux choses :
Extraire la valeur d'origine correspondant au cookie signé
Vérifier si le cookie signé est légal
Le code d'implémentation est le suivant :
// str:签名后的cookie,比如 "s:chyingp.uVofnk6k+9mHQpdPlQeOfjM8B5oa6mppny9d+mG9rD0" // secret:秘钥,比如 "secret" function signedCookie(str, secret) { // 检查是否 s: 开头,确保只对签过名的cookie进行解析 if (str.substr(0, 2) !== 's:') { return str; } // 校验签名的值是否合法,如合法,返回true,否则,返回false var val = unsign(str.slice(2), secret); if (val !== false) { return val; } return false; }
Il est relativement simple de juger et d'extraire la valeur originale du cookie. C’est juste que le nom de la méthode unsign prête à confusion.
Généralement, seules les signatures seront légalement vérifiées, et il n'y a pas de soi-disant contre-signature. Le code de la méthode
unsign
est le suivant :
Tout d'abord, extrayez la valeur d'origine A1 et la valeur de signature B1 de la valeur du cookie entrant.
Deuxièmement, utilisez la même clé secrète pour signer A1 afin d'obtenir A2.
Enfin, déterminez si la signature est légale en fonction du fait que A2 et B1 sont égaux.
exports.unsign = function(val, secret){
var str = val.slice(0, val.lastIndexOf('.')) , mac = exports.sign(str, secret); return sha1(mac) == sha1(val) ? str : false; };
Principalement pour des raisons de sécurité, pour empêcher la falsification des cookies et renforcer la sécurité.
Prenons un petit exemple pour voir comment la signature des cookies peut empêcher la falsification.
Développez en fonction de l'exemple précédent. Supposons que le site Web utilise le cookie pseudo pour distinguer qui est l'utilisateur actuellement connecté. Dans l'exemple précédent, dans le cookie de l'utilisateur connecté, la valeur correspondant au pseudo est la suivante : (après décodage)
s:chyingp.uVofnk6k+9mHQpdPlQeOfjM8B5oa6mppny9d+mG9rD0
A ce moment, quelqu'un a tenté de modifier la valeur du cookie pour atteindre l'objectif de falsification d'identité. Par exemple, remplacez-le par xiaoming :
s:xiaoming.uVofnk6k+9mHQpdPlQeOfjM8B5oa6mppny9d+mG9rD0
Lorsque le site Web reçoit la demande, il analyse le cookie de signature et constate que la vérification de la signature échoue. On peut en déduire que le cookie est falsifié.
hmac("xiaoming", "secret") !== "uVofnk6k+9mHQpdPlQeOfjM8B5oa6mppny9d+mG9rD0"
Bien sûr que non ?
L'exemple de la section précédente utilise uniquement la valeur du cookie pseudo pour déterminer quel utilisateur est connecté. C'est une très mauvaise conception. Bien qu’il soit difficile de falsifier des cookies signés lorsque la clé secrète est inconnue. Mais lorsque le nom d’utilisateur est le même, la signature est également la même. Dans ce cas, il est en réalité très facile à falsifier.
Ce qui précède est ce que j'ai compilé pour vous. J'espère que cela vous sera utile à l'avenir.
Articles associés :
Communication du composant Vue (tutoriel détaillé)
Analyse détaillée du code source de Vue Socket.io
Utilisez JavaScript natif pour obtenir l'effet loupe
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!