Heim > Web-Frontend > js-Tutorial > Hauptteil

So verwenden Sie die Cookie-Parser-Middleware in Express

亚连
Freigeben: 2018-06-08 14:54:28
Original
1727 Leute haben es durchsucht

Dieser Artikel stellt hauptsächlich eine ausführliche Analyse des Express-Cookie-Parser-Middleware-Implementierungsbeispiels vor. Jetzt teile ich es mit Ihnen und gebe es als Referenz.

Artikeleinführung

Cookie-Parser ist die Middleware von Express, die zum Parsen von Cookies verwendet wird, und 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 ausführlich der Implementierungsmechanismus der Signatur und Überprüfung des Express + Cookie-Parsers erläutert und wie die Cookie-Signatur die Website-Sicherheit erhöht.

Textsynchronisierung ist in der GitHub-Themenreihe „Nodejs Learning Notes“ enthalten

Beispiel für den ersten Schritt: Cookie-Einstellungen und Parsing

Schauen wir uns zunächst die Verwendung des Cookie-Parsers anhand des einfachsten Beispiels an. Die Standardkonfiguration wird hier 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);
Nach dem Login kopieren

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();
});
Nach dem Login kopieren

Fortgeschrittenes 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);
Nach dem Login kopieren

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+9mHQpdPlQeOfjM8B5oa6mppny9d+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 die Analyse 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;
};
Nach dem Login kopieren

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);
}
Nach dem Login kopieren

Woher kommt das secret hier? Es wird während der cookie-parser -Initialisierung übergeben. Wie im folgenden Pseudocode gezeigt:

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

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;
}
Nach dem Login kopieren

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;
};
Nach dem Login kopieren

Die Rolle der Cookie-Signatur

Hauptsächlich aus Sicherheitsgründen, um Cookie-Manipulationen zu verhindern und die Sicherheit zu erhöhen.

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 dem Nick entsprechende Wert im Cookie des angemeldeten Benutzers wie folgt: (nach der Dekodierung)

s:chyingp.uVofnk6k+9mHQpdPlQeOfjM8B5oa6mppny9d+mG9rD0

Zu diesem Zeitpunkt hat jemand versucht, dies zu tun Ändern Sie den Cookie-Wert, 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üfung fehlschlägt. Daraus kann geschlossen werden, dass das Cookie gefälscht ist.

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

Garantiert eine Signatur Sicherheit?

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.

Ich habe das Obige für Sie zusammengestellt und hoffe, dass es Ihnen in Zukunft hilfreich sein wird.

Verwandte Artikel:

Vue-Komponentenkommunikation (ausführliches Tutorial)

Detaillierte Analyse des Vue Socket.io-Quellcodes

Verwenden Sie natives JavaScript, um den Lupeneffekt zu erzielen

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

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!