Heim > Artikel > Web-Frontend > So verwenden Sie die Cookie-Parser-Middleware in Express
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.
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
Schauen wir uns zunächst die Verwendung des Cookie-Parsers anhand des einfachsten Beispiels an. Die Standardkonfiguration wird hier verwendet.
Cookie-Einstellungen: Verwenden Sie die integrierte Methode res.cookie() von Express.
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(); });
Aus Sicherheitsgründen müssen wir Cookies normalerweise signieren.
Das Beispiel wird wie folgt umgeschrieben, wobei einige Punkte zu beachten sind:
Wenn cookieParser initialisiert wird, übergeben Sie es im Geheimen als Signaturschlüssel.
Wenn Sie ein Cookie setzen, setzen Sie „signed“ auf „true“, um das zu setzende Cookie zu signieren.
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+9mHQpdPlQeOfjM8B5oa6mppny9d+mG9rD0
.
Lassen Sie uns analysieren, wie Cookie-Signatur und -Analyse implementiert werden.
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; };
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 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'));
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:
Extrahieren Sie den ursprünglichen Wert, der dem signierten Cookie entspricht.
Ü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:
Extrahieren Sie zunächst den Originalwert A1 und den Signaturwert B1 aus dem eingehenden Cookie-Wert.
Zweitens verwenden Sie denselben geheimen Schlüssel, um A1 zu signieren, um A2 zu erhalten.
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; };
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"
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!