Jadual Kandungan
文章导读" >文章导读
入门例子:cookie设置与解析" >入门例子:cookie设置与解析
进阶例子:cookie签名与解析" >进阶例子:cookie签名与解析
cookie签名、验证实现剖析" >cookie签名、验证实现剖析
cookie签名的作用" >cookie签名的作用
签名就一定能够确保安全吗" >签名就一定能够确保安全吗
Rumah hujung hadapan web tutorial js 在Express中如何使用cookie-parser中间件

在Express中如何使用cookie-parser中间件

Jun 08, 2018 pm 02:54 PM
express

本篇文章主要介绍了深入剖析Express cookie-parser中间件实现示例,现在分享给大家,也给大家做个参考。

文章导读

cookie-parser 是Express的中间件,用来实现cookie的解析,是官方脚手架内置的中间件之一。

它的使用非常简单,但在使用过程中偶尔也会遇到问题。一般都是因为对 Express + cookie-parser 的签名、验证机制不了解导致的。

本文深入讲解 Express + cookie-parser 的签名和验证的实现机制,以及cookie签名是如何增强网站的安全性的。

文本同步收录于GitHub主题系列 《Nodejs学习笔记》

入门例子:cookie设置与解析

先从最简单的例子来看下 cookie-parser 的使用,这里采用默认配置。

  1. cookie设置:使用 Express 的内置方法 res.cookie() 。

  2. 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);
Salin selepas log masuk

在当前场景下, cookie-parser 中间件大致实现如下:

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

进阶例子:cookie签名与解析

出于安全的考虑,我们通常需要对cookie进行签名。

例子改写如下,有几个注意点:

  1. cookieParser 初始化时,传入 secret 作为签名的秘钥。

  2. 设置cookie时,将 signed 设置为 true ,表示对即将设置的cookie进行签名。

  3. 获取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);
Salin selepas log masuk

签名前的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;
};
Salin selepas log masuk

sign 为签名函数。伪代码如下,其实就是把cookie的原始值,跟hmac后的值拼接起来。

敲黑板划重点:签名后的cookie值,包含了原始值。

function sign (val, secret) {
 return val + '.' + hmac(val, secret);
}
Salin selepas log masuk

这里的 secret 哪来的呢?是 cookie-parser 初始化的时候传入的。如下伪代码所示:

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

签名cookie解析

知道了cookie签名的机制后,如何"解析"签名cookie就很清楚了。这个阶段,中间件主要做了两件事:

  1. 将签名cookie对应的原始值提取出来

  2. 验证签名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;
}
Salin selepas log masuk

判断、提取cookie原始值比较简单。只是是 unsign 方法名比较有迷惑性。

一般只会对签名进行合法校验,并没有所谓的反签名。

unsign 方法的代码如下:

  1. 首先,从传入的cookie值中,分别提取出原始值A1、签名值B1。

  2. 其次,用同样的秘钥对A1进行签名,得到A2。

  3. 最后,根据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;
};
Salin selepas log masuk

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。但用户名相同的情况下,签名也是相同的。这种情况下,其实是很容易伪造的。

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

Vue组件通信(详细教程)

Vue Socket.io源码详细分析

使用原生JavaScript实现放大镜效果

Atas ialah kandungan terperinci 在Express中如何使用cookie-parser中间件. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Repo: Cara menghidupkan semula rakan sepasukan
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Cara menggunakan ekspres untuk mengendalikan muat naik fail dalam projek nod Cara menggunakan ekspres untuk mengendalikan muat naik fail dalam projek nod Mar 28, 2023 pm 07:28 PM

Bagaimana untuk mengendalikan muat naik fail? Artikel berikut akan memperkenalkan kepada anda cara menggunakan ekspres untuk mengendalikan muat naik fail dalam projek nod saya harap ia akan membantu anda!

Analisis perbandingan Express dan Laravel: Pilih rangka kerja yang lebih sesuai dengan anda Analisis perbandingan Express dan Laravel: Pilih rangka kerja yang lebih sesuai dengan anda Mar 10, 2024 pm 10:15 PM

Express dan Laravel ialah dua rangka kerja web yang sangat popular, masing-masing mewakili rangka kerja cemerlang dua bahasa pembangunan utama JavaScript dan PHP. Artikel ini akan menjalankan analisis perbandingan kedua-dua rangka kerja ini untuk membantu pembangun memilih rangka kerja yang lebih sesuai untuk keperluan projek mereka. 1. Pengenalan Rangka Kerja Express ialah rangka kerja aplikasi web berdasarkan platform Node.js Ia menyediakan satu siri fungsi dan alatan berkuasa yang membolehkan pembangun membina aplikasi web berprestasi tinggi dengan cepat. Ekspres

Perbandingan mendalam Express dan Laravel: Bagaimana untuk memilih rangka kerja terbaik? Perbandingan mendalam Express dan Laravel: Bagaimana untuk memilih rangka kerja terbaik? Mar 09, 2024 pm 01:33 PM

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

Express vs. Laravel: Membandingkan kebaikan dan keburukan, yang manakah akan anda pilih? Express vs. Laravel: Membandingkan kebaikan dan keburukan, yang manakah akan anda pilih? Mar 10, 2024 am 08:39 AM

Express vs. Laravel: Membandingkan kebaikan dan keburukan, yang manakah akan anda pilih? Dalam bidang pembangunan web, Express dan Laravel adalah dua rangka kerja yang telah menarik perhatian ramai. Express ialah rangka kerja aplikasi web yang fleksibel dan ringan berdasarkan Node.js, manakala Laravel ialah rangka kerja pembangunan web yang elegan dan kaya dengan ciri berdasarkan PHP. Artikel ini akan membandingkan kelebihan dan kekurangan Express dan Laravel dari segi kefungsian, kemudahan penggunaan, kebolehskalaan dan sokongan komuniti, serta menggabungkan

Mari kita bincangkan tentang cara node express mengendalikan kuki Mari kita bincangkan tentang cara node express mengendalikan kuki Jun 22, 2022 am 10:01 AM

Bagaimanakah node express mengendalikan kuki? Artikel berikut akan memperkenalkan kepada anda cara menggunakan nod untuk mengendalikan kuki saya harap ia akan membantu anda!

Ekspres atau Laravel? Pilih rangka kerja bahagian belakang yang paling sesuai untuk anda Ekspres atau Laravel? Pilih rangka kerja bahagian belakang yang paling sesuai untuk anda Mar 10, 2024 pm 06:06 PM

Apabila ia datang untuk memilih rangka kerja bahagian belakang, kedua-dua Express dan Laravel adalah pilihan yang sangat popular. Express ialah rangka kerja pembangunan aplikasi web berdasarkan Node.js, manakala Laravel ialah rangka kerja pembangunan aplikasi web berdasarkan PHP. Kedua-duanya mempunyai kelebihan mereka sendiri, dan memilih rangka kerja yang paling sesuai dengan anda memerlukan mempertimbangkan banyak faktor. Kekuatan rangka kerja Express adalah kelenturan dan keluk pembelajaran yang mudah. Idea teras Express ialah "cukup kecil dan cukup fleksibel", dan ia menyediakan sejumlah besar perisian tengah

Yang manakah lebih baik ekspres atau laravel? Yang manakah lebih baik ekspres atau laravel? Jul 05, 2023 pm 01:16 PM

Laravel bagus untuk sebab berikut: 1. Laravel menggunakan bahasa PHP, mempunyai sintaks yang elegan dan intuitif, dan menyediakan sejumlah besar fungsi dan alatan 2. Laravel mempunyai pelbagai pakej sambungan, pemalam dan penyelesaian; mempunyai dokumentasi rasmi yang sangat lengkap dan mudah difahami 4. Laravel menyediakan sokongan yang baik untuk keselamatan data dan pengesahan pengguna 5. Laravel boleh memisahkan logik perniagaan dan lapisan paparan; kepada teknologi terkini.

Bagaimana untuk membina sistem blog mudah menggunakan Node.js Bagaimana untuk membina sistem blog mudah menggunakan Node.js Nov 08, 2023 pm 06:45 PM

Cara menggunakan Node.js untuk membina sistem blog ringkas Node.js ialah persekitaran masa jalan JavaScript berdasarkan enjin ChromeV8, yang boleh menjadikan JavaScript berjalan dengan lebih cekap. Dengan bantuan Node.js, kami boleh membina aplikasi sisi pelayan yang berkuasa menggunakan JavaScript, termasuk sistem blog. Artikel ini akan memperkenalkan anda kepada cara menggunakan Node.js untuk membina sistem blog ringkas dan memberikan anda contoh kod khusus. Sila tekan

See all articles