对cookie-parser的理解(签名、加密)

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中间件 需要导入,不能直接使用

 1 // 导入express
 2 const express=require(‘express‘)
 3 // 导入cookie中间件
 4 const cookieParser = require(‘cookie-parser‘);
 5
 6 const app = express();
 7 // 使用cookie-parser解析客户端传入的cookie  加密解密
 8 app.use(cookieParser());
 9 // 向客户端发送cookie
10 app.get(‘/send‘,(req,res)=>{
11     res.cookie(‘name‘,‘nihao‘,{maxAge:60*1000})
12     res.send(‘向客户端发送cookie‘)
13 })
14 // 接收服务器端传入的cookie
15 app.get(‘/receive‘,(req,res)=>{
16     // cookies 是保存前面所有的cookie
17     // res.send(‘接收到的cookie-->‘+req.cookies.name)
18
19 })
20
21
22 app.listen( 3000,()=>{
23     console.log(`serve running at http://localhost:3000`)
24 })

  • cookie签名、解析

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

主要要注意一下几点:

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

原文地址:https://www.cnblogs.com/wszzj/p/12058434.html

时间: 2024-08-03 10:25:59

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

cookie导读,理解什么是cookie

一.cookie导读,理解什么是cookie 1.什么是cookie:cookie是一种能够让网站服务器把少量数据(4kb左右)存储到客户端的硬盘或内存.并且读可以取出来的一种技术. 2.当你浏览某网站时,由web服务器放置于你硬盘上的一个非常小的文本文件,它可以记录你的用户id.浏览过的网页或者停留的时间等网站想要你保存的信息.当你再次通过浏览器访问该网站时,浏览器会自动将属于该网站的cookie发送到服务器去,服务器通过读取cookie,得知你的相关信息,就可以做出相应的动作.比如,显示欢迎

[Publish AAR To Maven] 使用GPG对文件进行签名加密

本篇文章隶属于 <使用 Gradle 发布 AAR 到 Maven 仓库>由于涉及东西较多,该文件还在起草中- ======================================================== 作者:qiujuer 博客:blog.csdn.net/qiujuer 网站:www.qiujuer.net 开源库:github.com/qiujuer/Genius-Android 转载请注明出处:http://blog.csdn.net/qiujuer/articl

ucloud api 签名加密perl版

ucloud api文档中对签名加密的方法实在看不明白,而且没有perl版本,特意写了一份供大家参考 use URI::Escape; use utf8; use Encode; use AnyEvent::HTTP::LWP::UserAgent; use Digest::SHA qw(sha1 sha1_hex sha1_base64); sub ucloudApiConn { my ( $publicKey, $privateKey, $baseUrl, $paramData ) = @_

推荐:安卓apk的签名加密

看到好的技术教程就想转载一下,不喜勿喷!谢谢配合,仅供菜鸟学习研究,不要做坏事哦\(^o^)/~ 1.加密apk. 这里我用的是爱加密  从project bin目录下copy apk文件上传到爱加密网站 加密 ,同时下载签名工具.可以参照  http://jingyan.baidu.com/article/925f8cb8151347c0dde0563d.html http://www.ijiami.cn/apply/Sign 2.生成签名apk的keystone 1)在eclipse中生成k

Js生成接口请求参数签名加密

js生成接口请求参数签名加密 定义规则:将所有参数字段按首字母排序, 拼接成key1 = value1 & key2 = value2的格式,再在末尾拼接上key = appSecret, 再做MD5加密生成sign,方法如下: function getSign(params, kAppKey, kAppSecret) { if (typeof params == "string") { return paramsStrSort(params); } else if (type

.net 签名加密实现的一种简单方法

加密方法有很多,以下是其中一种简单的签名模式 1.首先客户端通过webapi按照IP地址,时间戳,随机数生成签名,并传递序列号 private Result_Sign Valid()        {            string ServerIP = "192.168.1.6";// HttpContext.Request.ServerVariables.Get("Local_Addr").ToString(); //地址            string

对session和cookie的一些理解(转载)

---恢复内容开始--- 文章出处:http://www.blogjava.net/cheneyfree/archive/2007/05/26/120168.html 虽然代码例子用的是JSP,但分析的十分详细. 由于项目需要,最近用session容器比较多,传载的同时加上了自己的一些理解,不足之处还请大家补充和纠正.一.cookie机制和session机制的区别 ******************************************************************

cookie&amp;&amp;session再理解笔记

就拿php来说,两个php页面之间不拿get,post传递变量的话,数据是不能共享的.访问完1.php页面该页面的变量就被销毁了.所以就拿学校食堂来说,拿现金买饭的话你交完钱后,他给你个票以便确认你,你到时候拿票来到各个窗口买东西.设置cookie后,第一次执行cookie设置是服务器给浏览器cookie信息,浏览器保存,此后每次就是浏览器拿着cookie信息你去给浏览器.每次请求其他页面,请求头就会把cookie的信息传递过去 第一次执行cookie 此后的话,cookie就由浏览器到服务器了

如何通过MAC电脑自带的mail软件收发签名加密邮件

使用该指南前请确认您已经成功申请了沃通的数字证书,如果还没有证书请访问:https://buy.wosign.com/ 申请WoSign客户端证书. 1.安装客户端邮件证书: a.先配置好MAC的邮件客户,可以正常收发邮件: b.申请了沃通的证书后,双击打开pfx文件 c. 双击打开后,提示输入密码: d.成功安装后,会在MAC的"钥匙串访问"中出现如下的数字证书信息: 2.使用邮件客户端发送签名和加密邮件: a.打开MAC的邮件客户端,新建一封邮件: b.输入收件人邮箱地址.主题,在

对Django框架中Cookie的简单理解

概念的理解:首先Cookie和Session一样,是django中用于视图保持状态的方案之一.为什么要进行视图保留呢,这是因为浏览器在向服务器发出请求时,服务器不会像人一样,有记忆,服务器像鱼一样,在你一次请求结束后她会很快忘掉你的,对她来说你的每一次请求都是新鲜的,这要是爱情就好了哈,可以爱情保鲜!闲话不多说,这种状态就是所谓的 "浏览器请求服务器是无状态",根本原因就复杂一些了,需要简单了解些网络编程中套接字Socket的通信方式,简单来说就是,浏览器和服务器进行通信需要使用Soc