全面掌握Express cookie-parser中间件
cookie-parser 是Express的中间件,用来实现cookie的解析,是官方脚手架内置的中间件之一。它的使用非常简单,但在使用过程中偶尔也会遇到问题。一般都是因为对 Express + cookie-parser 的签名、验证机制不了解导致的。本文主要和大家介绍Express cookie-parser中间件实现示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。
入门例子:cookie设置与解析
先从最简单的例子来看下 cookie-parser 的使用,这里采用默认配置。
cookie设置:使用 Express 的内置方法 res.cookie() 。
cookie解析:使用 cookie-parser 中间件。
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);
在当前场景下, cookie-parser 中间件大致实现如下:
app.use(function (req, res, next) { req.cookies = cookie.parse(req.headers.cookie); next(); });
进阶例子:cookie签名与解析
出于安全的考虑,我们通常需要对cookie进行签名。
例子改写如下,有几个注意点:
cookieParser 初始化时,传入 secret 作为签名的秘钥。
设置cookie时,将 signed 设置为 true ,表示对即将设置的cookie进行签名。
获取cookie时,可以通过 req.cookies ,也可以通过 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);
签名前的cookie值为 chyingp ,签名后的cookie值为 s%3Achyingp.uVofnk6k%2B9mHQpdPlQeOfjM8B5oa6mppny9d%2BmG9rD0 ,decode后为 s:chyingp.uVofnk6k+9mHQpdPlQeOfjM8B5oa6mppny9d+mG9rD0 。
下面就来分析下,cookie的签名、解析是如何实现的。
cookie签名、验证实现剖析
Express完成cookie值的签名, cookie-parser 实现签名cookie的解析。两者共用同一个秘钥。
cookie签名
Express对cookie的设置(包括签名),都是通过 res.cookie() 这个方法实现的。
精简后的代码如下:
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 为签名函数。伪代码如下,其实就是把cookie的原始值,跟hmac后的值拼接起来。
敲黑板划重点:签名后的cookie值,包含了原始值。
function sign (val, secret) { return val + '.' + hmac(val, secret); }
这里的 secret 哪来的呢?是 cookie-parser 初始化的时候传入的。如下伪代码所示:
var cookieParser = function (secret) { return function (req, res, next) { req.secret = secret; // ... next(); }; }; app.use(cookieParser('secret'));
签名cookie解析
知道了cookie签名的机制后,如何"解析"签名cookie就很清楚了。这个阶段,中间件主要做了两件事:
将签名cookie对应的原始值提取出来
验证签名cookie是否合法
实现代码如下:
// 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; }
判断、提取cookie原始值比较简单。只是是 unsign 方法名比较有迷惑性。
一般只会对签名进行合法校验,并没有所谓的反签名。
unsign 方法的代码如下:
首先,从传入的cookie值中,分别提取出原始值A1、签名值B1。
其次,用同样的秘钥对A1进行签名,得到A2。
最后,根据A2、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; };
cookie签名的作用
主要是出于安全考虑, 防止cookie被篡改 ,增强安全性。
举个小例子来看下cookie签名是如何实现防篡改的。
基于前面的例子展开。假设网站通过 nick 这个cookie来区分当前登录的用户是谁。在前面例子中,登录用户的cookie中,nick对应的值如下:(decode后的)
s:chyingp.uVofnk6k+9mHQpdPlQeOfjM8B5oa6mppny9d+mG9rD0
此时,有人试图修改这个cookie值,来达到伪造身份的目的。比如修改成 xiaoming :
s:xiaoming.uVofnk6k+9mHQpdPlQeOfjM8B5oa6mppny9d+mG9rD0
当网站收到请求,对签名cookie进行解析,发现签名验证不通过。由此可判断,cookie是伪造的。
hmac("xiaoming", "secret") !== "uVofnk6k+9mHQpdPlQeOfjM8B5oa6mppny9d+mG9rD0"
签名就一定能够确保安全吗
当然不是。
上个小节的例子,仅通过 nick 这个cookie的值来判断登录的是哪个用户,这是一个非常糟糕的设计。虽然在秘钥未知的情况下,很难伪造签名cookie。但用户名相同的情况下,签名也是相同的。这种情况下,其实是很容易伪造的。
另外,开源组件的算法是公开的,因此秘钥的安全性就成了关键,要确保秘钥不泄露。
还有很多,这里不展开。
小结
本文主要对 Express + cookie-parser 的签名和解析机制进行相对深入的介绍。
不少类似的总结文章中,把cookie的签名说成了加密,这是一个常见的错误,读者朋友需要注意一下。
签名部分的介绍,稍微涉及一些简单的安全知识,对这块不熟悉的同学可以留言交流。为讲解方便,部分段落、用词可能不够严谨。如有错漏,敬请指出。
相关推荐:
Atas ialah kandungan terperinci 全面掌握Express cookie-parser中间件. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Prinsip perisian tengah tomcat dilaksanakan berdasarkan spesifikasi Java Servlet dan Java EE. Sebagai bekas Servlet, Tomcat bertanggungjawab untuk memproses permintaan dan respons HTTP dan menyediakan persekitaran berjalan untuk aplikasi Web. Prinsip-prinsip perantara Tomcat terutamanya melibatkan: 1. Model kontena 2. Mekanisme pemprosesan Servlet 5. Pengurusan konfigurasi 7. Penyambung dan pengimbangan; teknologi; 9. Mod terbenam, dsb.

Cara menggunakan perisian tengah untuk mengendalikan pengesahan borang dalam Laravel, contoh kod khusus diperlukan Pengenalan: Pengesahan borang ialah tugas yang sangat biasa dalam Laravel. Untuk memastikan kesahihan dan keselamatan data yang dimasukkan oleh pengguna, kami biasanya mengesahkan data yang diserahkan dalam borang. Laravel menyediakan fungsi pengesahan borang yang mudah dan juga menyokong penggunaan perisian tengah untuk mengendalikan pengesahan borang. Artikel ini akan memperkenalkan secara terperinci cara menggunakan perisian tengah untuk mengendalikan pengesahan borang dalam Laravel dan memberikan contoh kod khusus.

Cara menggunakan perisian tengah untuk pecutan data dalam Laravel Pengenalan: Apabila membangunkan aplikasi web menggunakan rangka kerja Laravel, pecutan data adalah kunci untuk meningkatkan prestasi aplikasi. Middleware ialah ciri penting yang disediakan oleh Laravel yang mengendalikan permintaan sebelum ia mencapai pengawal atau sebelum respons dikembalikan. Artikel ini akan menumpukan pada cara menggunakan perisian tengah untuk mencapai pecutan data dalam Laravel dan memberikan contoh kod khusus. 1. Apakah middleware itu adalah mekanisme dalam rangka kerja Laravel

Cara menggunakan middleware untuk penukaran respons dalam Laravel Middleware ialah salah satu ciri yang sangat berkuasa dan praktikal dalam rangka kerja Laravel. Ia membolehkan kami memproses permintaan dan respons sebelum permintaan memasuki pengawal atau sebelum respons dihantar kepada klien. Dalam artikel ini, saya akan menunjukkan cara menggunakan perisian tengah untuk transformasi respons dalam Laravel. Sebelum memulakan, pastikan anda memasang Laravel dan projek baharu dibuat. Sekarang kita akan mengikuti langkah berikut: Cipta perisian tengah baru Terbuka

Cara menggunakan perisian tengah untuk penjadualan tugas berjadual dalam Laravel Pengenalan: Laravel ialah rangka kerja sumber terbuka PHP yang popular yang menyediakan alatan yang mudah dan berkuasa untuk membangunkan aplikasi web. Salah satu ciri penting ialah penjadualan tugas bermasa, yang membolehkan pembangun menjalankan tugas tertentu pada selang waktu tertentu. Dalam artikel ini, kami akan memperkenalkan cara menggunakan perisian tengah untuk melaksanakan penjadualan tugas berjadual Laravel dan menyediakan contoh kod khusus. Persediaan Persekitaran Sebelum bermula, kita perlu pastikan

Laravel ialah rangka kerja aplikasi web PHP yang popular yang menyediakan banyak cara cepat dan mudah untuk membina aplikasi web yang cekap, selamat dan berskala. Apabila membangunkan aplikasi Laravel, kita sering perlu mempertimbangkan isu pemulihan data, iaitu, cara memulihkan data dan memastikan operasi normal aplikasi sekiranya berlaku kehilangan atau kerosakan data. Dalam artikel ini, kami akan memperkenalkan cara menggunakan perisian tengah Laravel untuk melaksanakan fungsi pemulihan data dan menyediakan contoh kod khusus. 1. Apa itu Lara?

Cara menyediakan Perkongsian Sumber Silang Asal (CORS) menggunakan perisian tengah dalam rangka kerja Slim Perkongsian Sumber Silang Asal (CORS) ialah mekanisme yang membolehkan pelayan menetapkan beberapa maklumat tambahan dalam pengepala respons HTTP untuk memberitahu penyemak imbas sama ada Benarkan silang -permintaan asal. Dalam sesetengah projek dengan pemisahan bahagian hadapan dan bahagian belakang, mekanisme CORS boleh digunakan untuk merealisasikan permintaan silang domain bahagian hadapan untuk antara muka bahagian belakang. Apabila menggunakan rangka kerja Slim untuk membangunkan REST API, kita boleh menggunakan middleware (Middleware)

Perbandingan mendalam Express dan Laravel: Bagaimana untuk memilih rangka kerja terbaik? Apabila memilih rangka kerja belakang yang sesuai untuk projek anda, Express dan Laravel sudah pasti dua pilihan popular di kalangan pembangun. Express ialah rangka kerja ringan berdasarkan Node.js, manakala Laravel ialah rangka kerja popular berdasarkan PHP. Artikel ini akan memberikan perbandingan yang mendalam tentang kelebihan dan kekurangan kedua-dua rangka kerja ini dan menyediakan contoh kod khusus untuk membantu pembangun memilih rangka kerja yang paling sesuai dengan keperluan mereka. Prestasi dan kebolehskalaanExpr
