全面掌握Express cookie-parser中间件

cookie-parserexpress中间件,用来实现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 secretapp.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的签名说成了加密,这是一个常见的错误,读者朋友需要注意一下。

签名部分的介绍,稍微涉及一些简单的安全知识,对这块不熟悉的同学可以留言交流。为讲解方便,部分段落、用词可能不够严谨。如有错漏,敬请指出。

相关推荐:

node通过实现express搭建自己的服务器实例

Node.js使用Express.Router实例详解

Express框架中使用Session实现登录时身份验证

以上就是全面掌握Express cookie-parser中间件的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2787841.html

(0)
上一篇 2025年3月8日 18:17:29
下一篇 2025年3月8日 18:17:42

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • express、multer实现node中图片上传功能

    在前端中,我们使用ajax来异步上传图片,使用file-input来上传图片,使用formdata对象来处理图片数据,post到服务器中,在node中使用multer中间件来对上传路由接口进行处理。本文主要和大家介绍使用express+mu…

    2025年3月8日
    200
  • 在express站点中使用ejs模板引擎实例详解

    本文主要和大家介绍在express站点中使用ejs模板引擎,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。 使用 vs创建的express站点,默认使用的是jade模板引擎,但是我不太喜欢这种…

    2025年3月8日
    200
  • 利用express启动server服务方法分享

    本文主要和大家分享利用express启动一个server服务的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。 安装express $ npm install express &#821…

    编程技术 2025年3月8日
    200
  • nodejs中Express与Koa2对比实例分享

    express诞生已有时日,是一个简洁而灵活的web开发框架,使用简单而功能强大。koa相对更为年轻,是express框架原班人马基于es6新特性重新开发的敏捷开发框架,现在可谓风头正劲,大有赶超express之势。 1、先说结论 目前没有…

    编程技术 2025年3月8日
    200
  • express搭建一个简单的查询服务器

    本文主要和大家介绍了使用express搭建一个简单的查询服务器的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到到大家。 使用到的技术栈有express、mysql. 项目结构: service…

    编程技术 2025年3月8日
    200
  • nodejs和express搭建多人聊天室

    准备工作:新建一个文件夹 chatroom在终端输入以下命令,按照步骤npm(没装过的去官网安装下node和npm)会自动给你生成一个package.json文件 安装express和socket.io package.json文件如下: …

    2025年3月8日 编程技术
    200
  • express路由管理的几种自动化方法分享

    我们平时在使用express写代码的过程中,会根据类别,将路由分为多个不同的文件,然后在项目的入口文件(例如app.js)中将其依次挂载,例如: const index = require(‘./routes/index’)const us…

    2025年3月8日 编程技术
    200
  • express中路由规则详解及如何获取请求参数

    本文主要为大家分享一篇基于express中路由规则及获取请求参数的方法,具有很好的参考价值,希望能帮助到大家。 express中常见的路由规则 主要使用的路由规则是get和post两种,即 var express = require(‘ex…

    编程技术 2025年3月8日
    200
  • nodejs基于express实现文件上传

    本文主要和大家介绍了nodejs基于express实现文件上传的方法,结合实例形式分析了nodejs基于express框架实现文件上传功能的具体步骤与相关操作技巧,需要的朋友可以参考下,希望能帮助到大家。 本人上传文件时是基于express…

    编程技术 2025年3月8日
    200
  • Express与Koa2的使用详解

    这次给大家带来Express与Koa2的使用详解,Express与Koa2使用的注意事项有哪些,下面就是实战案例,一起来看一下。 知会上看到有个问题 《Express会被Koa2取代吗?》 。刚好对Express、koa有点小研究,于是简单…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论