Heim  >  Artikel  >  Web-Frontend  >  Umfassende Beherrschung der Express-Cookie-Parser-Middleware

Umfassende Beherrschung der Express-Cookie-Parser-Middleware

小云云
小云云Original
2018-02-02 09:57:571767Durchsuche

Cookie-Parser ist die Middleware von Express, die zum Parsen von Cookies verwendet wird. Es handelt sich um eine der Middleware, die in das offizielle Gerüst integriert ist. Die Verwendung ist sehr einfach, es kann jedoch gelegentlich zu Problemen bei der Verwendung kommen. Dies wird normalerweise durch mangelndes Verständnis der Signatur- und Überprüfungsmechanismen von Express + Cookie-Parser verursacht. In diesem Artikel wird Ihnen hauptsächlich das Implementierungsbeispiel für die Express-Cookie-Parser-Middleware vorgestellt. Der Herausgeber findet es recht gut, daher werde ich es jetzt mit Ihnen teilen und als Referenz geben. Folgen wir dem Herausgeber und schauen wir uns das an. Ich hoffe, es kann allen helfen.

Erste Schritte: Cookie-Einstellungen und Parsing

Beginnen wir mit dem einfachsten Beispiel, um die Verwendung des Cookie-Parsers zu betrachten. Hier wird die Standardkonfiguration verwendet.

  1. Cookie-Einstellungen: Verwenden Sie die integrierte Methode res.cookie() von Express.

  2. Cookie-Parsing: Cookie-Parser-Middleware verwenden.

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);

Im aktuellen Szenario ist die Cookie-Parser-Middleware grob wie folgt implementiert:

app.use(function (req, res, next) {
 req.cookies = cookie.parse(req.headers.cookie);
 next();
});

Erweitertes Beispiel: Cookie-Signatur und -Analyse

Aus Sicherheitsgründen müssen wir Cookies normalerweise signieren.

Das Beispiel wird wie folgt umgeschrieben, wobei einige Punkte zu beachten sind:

  1. Wenn cookieParser initialisiert wird, übergeben Sie es im Geheimen als Signaturschlüssel.

  2. Wenn Sie ein Cookie setzen, setzen Sie „signed“ auf „true“, um das zu setzende Cookie zu signieren.

  3. Wenn Sie Cookies erhalten, können Sie diese über req.cookies oder req.signedCookies erhalten.

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);

Der Cookie-Wert vor dem Signieren ist chyingp, der Cookie-Wert nach dem Signieren ist s%3Achyingp.uVofnk6k%2B9mHQpdPlQeOfjM8B5oa6mppny9d%2BmG9rD0 und nach der Dekodierung ist er s:chyingp.uVofnk6k+ 9mHQpdPlQe OfjM8B5oa6mppny9d+ mG9rD0.

Lassen Sie uns analysieren, wie Cookie-Signatur und -Analyse implementiert werden.

Analyse der Cookie-Signatur und Verifizierungsimplementierung

Express vervollständigt die Signatur von Cookie-Werten und Cookie-Parser implementiert das Parsen signierter Cookies. Beide teilen den gleichen geheimen Schlüssel.

Cookie-Signatur

Die Cookie-Einstellungen von Express (einschließlich Signaturen) werden alle über die Methode res.cookie() implementiert.

Der vereinfachte Code lautet wie folgt:

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 ist die Signaturfunktion. Der Pseudocode lautet wie folgt, der tatsächlich den ursprünglichen Wert des Cookies mit dem Wert nach hmac verkettet.

Wichtiger Punkt an der Tafel: Der signierte Cookie-Wert beinhaltet den Originalwert.

function sign (val, secret) {
 return val + '.' + hmac(val, secret);
}

Woher kommt das Geheimnis hier? Es wird übergeben, wenn der Cookie-Parser initialisiert wird. Wie im folgenden Pseudocode gezeigt:

var cookieParser = function (secret) {
 return function (req, res, next) {
  req.secret = secret;
  // ...
  next();
 };
};
app.use(cookieParser('secret'));

Signiertes Cookie-Parsen

Nachdem man den Mechanismus der Cookie-Signatur kennt, ist klar, wie man das signierte Cookie „analysiert“. In dieser Phase führt die Middleware hauptsächlich zwei Dinge aus:

  1. Extrahieren Sie den ursprünglichen Wert, der dem signierten Cookie entspricht.

  2. Überprüfen Sie, ob es sich um ein signiertes Cookie handelt legal

Der Implementierungscode lautet wie folgt:

// 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;
}

Es ist relativ einfach, den ursprünglichen Wert des Cookies zu beurteilen und zu extrahieren. Es ist nur so, dass der Name der Unsign-Methode verwirrend ist.

Grundsätzlich werden nur Unterschriften rechtsgültig beglaubigt, eine sogenannte Gegenzeichnung gibt es nicht.

Der Code der Unsign-Methode lautet wie folgt:

  1. Extrahieren Sie zunächst den Originalwert A1 und den Signaturwert B1 aus dem eingehenden Cookie-Wert.

  2. Zweitens verwenden Sie denselben geheimen Schlüssel, um A1 zu signieren, um A2 zu erhalten.

  3. Bestimmen Sie abschließend anhand der Gleichheit von A2 und B1, ob die Signatur zulässig ist.

exports.unsign = function(val, Secret){

 var str = val.slice(0, val.lastIndexOf('.'))
  , mac = exports.sign(str, secret);
 
 return sha1(mac) == sha1(val) ? str : false;
};

Die Rolle der Cookie-Signatur

dient hauptsächlich der Vermeidung von Sicherheitsgründen Zur Erhöhung der Sicherheit wurden Cookies manipuliert.

Nehmen wir ein kleines Beispiel, um zu sehen, wie die Cookie-Signatur Manipulationen verhindern kann.

Erweitern Sie basierend auf dem vorherigen Beispiel. Gehen Sie davon aus, dass die Website das Nick-Cookie verwendet, um zu unterscheiden, wer der aktuell angemeldete Benutzer ist. Im vorherigen Beispiel lautet der entsprechende Wert von Nick im Cookie des angemeldeten Benutzers wie folgt: (nach der Dekodierung)

s:chyingp.uVofnk6k+9mHQpdPlQeOfjM8B5oa6mppny9d+mG9rD0

Zu diesem Zeitpunkt versucht jemand, diesen Cookie-Wert zu ändern, um den Zweck der Identitätsfälschung zu erreichen. Ändern Sie es beispielsweise in „xiong“:

s:xiaoming.uVofnk6k+9mHQpdPlQeOfjM8B5oa6mppny9d+mG9rD0

Wenn die Website die Anfrage empfängt, analysiert sie das Signatur-Cookie und stellt fest, dass die Signatur überprüft wurde scheitert. Daraus kann geschlossen werden, dass das Cookie gefälscht ist.

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

Werden Signaturen Sicherheit garantieren?

Natürlich nicht.

Das Beispiel im vorherigen Abschnitt verwendet nur den Wert des Nick-Cookies, um zu bestimmen, welcher Benutzer angemeldet ist. Dies ist ein sehr schlechtes Design. Allerdings ist es schwierig, signierte Cookies zu fälschen, wenn der geheime Schlüssel unbekannt ist. Aber wenn der Benutzername derselbe ist, ist auch die Signatur gleich. In diesem Fall ist es tatsächlich sehr leicht zu fälschen.

Darüber hinaus sind die Algorithmen von Open-Source-Komponenten öffentlich, sodass die Sicherheit des geheimen Schlüssels zum Schlüssel wird und sichergestellt werden muss, dass der geheime Schlüssel nicht durchgesickert ist.

Es gibt noch viele weitere, daher werde ich hier nicht näher darauf eingehen.

Zusammenfassung

Dieser Artikel bietet hauptsächlich eine relativ ausführliche Einführung in den Signatur- und Analysemechanismus von Express + Cookie-Parser.

In vielen ähnlichen zusammenfassenden Artikeln wird die Cookie-Signatur als Verschlüsselung beschrieben. Dies ist ein häufiger Fehler und die Leser müssen darauf achten.

Die Einführung in den Signaturteil beinhaltet ein wenig einfaches Sicherheitswissen. Schüler, die mit diesem Thema nicht vertraut sind, können eine Nachricht hinterlassen, um zu kommunizieren. Der Einfachheit halber sind einige Absätze und Formulierungen möglicherweise nicht streng genug. Sollten Fehler oder Auslassungen vorliegen, weisen Sie bitte darauf hin.

Verwandte Empfehlungen:

Knoten erstellt seine eigene Serverinstanz durch Implementierung von Express

Node.js verwendet die Express.Router-Instanz Ausführliche Erklärung

Verwendung von Session im Express-Framework zur Implementierung der Authentifizierung bei der Anmeldung

Das obige ist der detaillierte Inhalt vonUmfassende Beherrschung der Express-Cookie-Parser-Middleware. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn