1.为什么说要利用签名防止cookie被恶意篡改

我们在浏览器输入用户名和密码发送post请求到后端服务器,后端服务器验证合法,返回响应,并Set-Cookiesessionid=***;username=water,然后浏览器接受到响应发Set-Cookie,于是将其存入内存或硬盘中;浏览器端再次发起请求,带上Cookie信息sessionid=***;username=water,请求修改自己的头像信息,服务器根据sessionid验证当前用户已登录,根据username,查找数据库中的对应数据,修改头像信息,这是一个正常的cookie设置与利用cookie的过程。但是我们为什么说要防止Cookie被篡改呢?这是因为cookie是存储在客户端的,这时用户可以任意修改cookie值,比如如果当前用户知道username的作用,修改username=fire,根据username,查找数据库中的对应数据,并修改了头像信息,这样就暴露出数据被恶意篡改的风险。其实就是服务端无法保证张三请求修改数据时到底是不是张三自己要求修改,也可能是李四是在恶意篡改张三的数据。这时我们就要给cookie增加签名,比如服务器接收到请求中的Cookie项username=fire||34sdklkas,然后使用签名生成算法secret(fire)=666,得到的签名666和请求中数据的签名不一致,则证明数据被篡改,不予通过,所以cookie中不应该存储敏感数据,应该根据SessionID将敏感数据存储在后端,取数据时根据SessionID去后端服务器获取,对于一些重要的Cookie项,应该生成对应的签名来反之被恶意篡改。

  1. 签名就能够确保安全吗 我们只通过用户名这个cookie来判断登录的是哪一个用户,虽然增加了签名,而且秘钥我们也不知道,看起来很难伪造签名cookie,但是只要原始值相同的情况下,签名也是相同的,这汇总情况下就很容易伪造了,而且我们要确保秘钥的生成算法不被泄露。
  2. Express中cookie-parser中间件的使用

cookie-parser中间件用来对cookie进行解析,主要包括普通cookie的解析和签名cookie的解析。

  • 简单用法

最简单的使用就是cookie的设置与解析,cookie的设置使用res.cookie方法,cookie的解析使用cookie-parser中间件

cookie-parser中间件 需要导入,不能直接使用

 // 导入express
const express=require('express')
// 导入cookie中间件
const cookieParser = require('cookie-parser'); const app = express();
// 使用cookie-parser解析客户端传入的cookie 加密解密
app.use(cookieParser());
// 向客户端发送cookie
app.get('/send',(req,res)=>{
res.cookie('name','nihao',{maxAge:60*1000})
res.send('向客户端发送cookie')
})
// 接收服务器端传入的cookie
app.get('/receive',(req,res)=>{
// cookies 是保存前面所有的cookie
// res.send('接收到的cookie-->'+req.cookies.name) }) app.listen( 3000,()=>{
console.log(`serve running at http://localhost:3000`)
})

  • cookie签名、解析

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

主要要注意一下几点:

    1. cookieParser初始化时,传入secret(参数)作为签名的秘钥。
    2. 设置cookie时,将signed设置为true,表示对cookie进行签名。
    3. 获取cookie时,可以同时通过req.cookies,也可以通过req.signedCookies获取。
 // 导入express
const express=require('express')
// 导入cookie中间件
const cookieParser = require('cookie-parser'); const app = express();
// 使用cookie-parser解析客户端传入的cookie 加密解密
app.use(cookieParser('aaa')); //secret
// 向客户端发送cookie
app.get('/send',(req,res)=>{
res.cookie('name','nihao',{maxAge:60*1000,signed:true})
res.send('向客户端发送cookie')
})
// 接收服务器端传入的cookie
app.get('/receive',(req,res)=>{
// cookies 是保存前面所有的cookie
res.send('接收到的cookie-->'+req.signedCookies.name) }) app.listen( 3000,()=>{
console.log(`serve running at http://localhost:3000`)
})

对cookie-parser的理解(签名、加密)的更多相关文章

  1. cookie导读,理解什么是cookie

    一.cookie导读,理解什么是cookie    1.什么是cookie:cookie是一种能够让网站服务器把少量数据(4kb左右)存储到客户端的硬盘或内存.并且读可以取出来的一种技术.    2. ...

  2. 对session和cookie的一些理解

    由于项目需要,最近用session容器比较多,传载的同时加上了自己的一些理解,不足之处还请大家补充和纠正.);                  response.addCookie(c1);   * ...

  3. 【转】js生成接口请求参数签名加密

    js生成接口请求参数签名加密 签名算法规则: 第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=v ...

  4. js生成接口请求参数签名加密

    js生成接口请求参数签名加密 定义规则:将所有参数字段按首字母排序, 拼接成key1 = value1 & key2 = value2的格式,再在末尾拼接上key = appSecret, 再 ...

  5. 签名&加密的区别

    https://www.zhihu.com/question/27669212/answer/38037256 就拿A给B发送经过签名加密信息来说: 1.A对信息签名的作用是确认这个信息是A发出的,不 ...

  6. 签名/加密_Java_hutool( 01 代码实现 )

    本文档不讲解签名/加密相关的理论知识, 仅列出通过Java实现的方式. 待处理: Hutool含有很多工具的封装, 有时间需要好好研究一下(https://blog.csdn.net/moshowga ...

  7. 关于bottle WEB框架中签名cookie的一点理解

    首先要理解一个概念 MAC (message authenticate code) 消息认证码(带密钥的Hash函数):密码学中,通信实体双方使用的一种验证机制,保证消息数据完整性的一种工具. 构造方 ...

  8. 几个例子理解对称加密与非对称加密、公钥与私钥、签名与验签、数字证书、HTTPS加密方式

    # 原创,转载请留言联系 为什么会出现这么多加密啊,公钥私钥啊,签名啊这些东西呢?说到底还是保证双方通信的安全性与完整性.例如小明发一封表白邮件给小红,他总不希望给别人看见吧.而各种各样的技术就是为了 ...

  9. cookie&&session再理解笔记

    就拿php来说,两个php页面之间不拿get,post传递变量的话,数据是不能共享的.访问完1.php页面该页面的变量就被销毁了.所以就拿学校食堂来说,拿现金买饭的话你交完钱后,他给你个票以便确认你, ...

  10. cookie mapping 原理理解

    深入浅出理解 COOKIE MAPPING Cookie mapping技术 利用javascript跨域访问cookie之广告推广

随机推荐

  1. [ASP.NET Core 3框架揭秘] 依赖注入[9]:实现概述

    <服务注册>.<服务消费>和<生命周期>主要从实现原理的角度对.NET Core的依赖注入框架进行了介绍,接下来更进一步,看看该框架的总体设计和实现.在过去的多个版 ...

  2. JavaFX如何为按钮设置快捷键?

    JavaFX为按钮设置快捷键的方式有很多,先说下常见的一种. 第一种: KeyCodeCombination kc1 = new KeyCodeCombination(KeyCode.W, KeyCo ...

  3. Python 使用中出现错误:ImportError: No module named _sqlite3

    解决办法: 1.先安装sqlite3    从sqlite官网:https://www.sqlite.org/download.html 上下载linux环境下的安装包:sqlite-autoconf ...

  4. 关于EXIT和BADI增强的查找

    EXIT出口的查找: 方法一: 第一步:通过SE30,输入TCODE(例如ME21N),执行EXCUTE,前台创建一张采购订单.点击TIMES页签,查找EXIT开头的SAP程序.  第二步:这些fun ...

  5. java中线程的几种实现方式

    1. 继承Thread类来实现 class MyThread extends Thread{ @Override public void run() { System.out.println(&quo ...

  6. HTML入门(html基本文本标签+快捷键讲解以及基本html组成解释)

    id 标签 功能  1  <hr /> 水平分割线  2 <br /> 强制让文本换行  3 <p>段落</p> 段落标签(自带换行效果)  4 < ...

  7. 45.QT-连接外部dll,lib库导入问题

    dll库问题 查看MZ_Card.dll对应的文档手册,如下图所示: 所以代码写为: typedef BOOL (*Fun)(BOOL IsOpenComm,unsigned long Port, u ...

  8. Android 8.1 SystemUI虚拟导航键加载流程解析

    需求 基于MTK 8.1平台定制导航栏部分,在左边增加音量减,右边增加音量加 思路 需求开始做之前,一定要研读SystemUI Navigation模块的代码流程!!!不要直接去网上copy别人改的需 ...

  9. 通过U盘在物理机安装CentOS出现Timeout的问题

    错误信息:centos dracut timeout..... 解决方案: 在进入install页面是,按e,启动编辑.要保证Label与U盘的卷标保持一致即可.

  10. Redis集群模式下的redis-py-cluster方式读写测试

    与MySQL主从复制,从节点可以分担部分读压力不一样,甚至可以增加slave或者slave的slave来分担读压力,Redis集群中的从节点,默认是不分担读请求的,从节点只作为主节点的备份,仅负责故障 ...