Cookies

cookies 特性

  • 前端数据存储
  • 后端通过 HTTP 头设置
  • 请求时通过 HTTP 头传给后端
  • 前端可读可写
  • 遵守同源策略
    • 域名
    • 有效期
    • 路径
    • http-only
    • secure(https)

cookies 作用

  • 存储个性化设置
  • 存储未登录时用户唯一标识
  • 存储已登录用户的凭证
  • 存储其他业务数据

Cookies-登录用户凭证

  • 前端提交用户名和密码

  • 后端验证用户名和密码

  • 后端通过 http 头设置用户凭证

  • 后续访问时后端先验证用户凭证

  • 验证用户 ID

  • ID+签名

生成复杂字符串

var crypt = {}
const KET = '#$%489!#$%&*156sd' crypt.cryptUserId = function(userId){
var crypto = require('crypto);
var sign = crypto.createHmac('sha256,KEY');
sign.updata(userId + '');
return sign.digest('hex');
} module.exports = crypt;

进行设置

//登陆成功,设置Cookies
ctx.cookies.set("sign", crypt.cryptUserId(user.id), {
httpOnly: false,
sameSite: "strict"
});
ctx.cookies.set("userId", user.id, {
httpOnly: false,
sameSite: "strict"
});

验证

var userId = ctx.cookies.get("userId");
var sign = ctx.cookies.get("sign");
var correctSign = crypt.cryptUserId(userId);
if (correctSign !== sign) {
throw new Errow("报告,有人入侵");
}

上面代码,可防御,篡改的 UserId 的入侵

  • SessionId

sessionId 为随机生成的字符串,第三方拿不到,就无法入侵

生成复杂字符串

var session = {};

session.set = function(userId, obj) {
var sessionId = Math.random();
if (!cache[sessionId]) {
cache[sessionId] = {};
}
cache[sessionId].conntent = obj;
return sessionId;
};
session.get = function(userId) {
return cache[session] && cache[sessionId].content;
};
module.exports = session;

进行设置

var sessionId = session.set(user.id, {
userId: user.id
});
ctx.cookies.set("sessionId", sessionId, {
httpOnly: ture,
sameSite: "strict"
});

验证

var sessionId = ctx.cookies.get("sessionId");
var sessionObj = session.get(sessionId);
if (!sessionObj || !sessionObj) {
throw new Error("session不存在");
}
var userId = sessionObj.userId;

sessionId 需要持久化,存入数据库,因为内存是有限的。都存在内存中,服务器会出问题

Cookies 其他

  • Cookies 与 XSS 的关系

    • XSS 可能偷取 Cookies
    • http-only 的 Cookies 不会被偷
  • Cookies 与 CSRF 的关系

    • CSRF 利用了用户 Cookies
    • 攻击站点无法读写 Cookies
    • 最好能阻止第三方使用 Cookies
  • Cookies 安全案例

    • 某学校教务处

      • 某学校教务系统使用了开源的 CMS
      • 改 CMS 使用 username 作为唯一用户标识
      • 改 CMS 文章作者暴露了 username
      • 可使用任意的 username 登录后台
    • 某论坛
      • 某论坛使用了某开源的 ASP BBS 程序
      • 改 ASP 程序使用用户 ID 作为用户标识
      • 可伪造任意用户登录

Cookies-安全策略

  • 签名防篡改
  • 私有变换(加密)
  • http-only(防止 XSS)
  • secure(仅允许 https 协议下使用 Cookies)
  • same-site(很好地策略,但不是所有浏览器都支持)

加密与解密

npm install crypto

var crypto = require("crypto");

var KEY = "#$%^156ssc#$%";
var cipher = crypto.createCipher("des", KEY);
var text = cipher.update("hello word", "utf8", "hex");
text += cipher.final("hex"); console.log(text);//加密后的 var decipher = crypto.createDecipher("des", KEY);
var originalText = decipher.update(text, "hex", "utf8"); console.log(originalText);//原来的

前端的Cookies的更多相关文章

  1. 前端网络安全——Cookies

    一.Cookies特性 1.前端数据存储 2.后端通过http头设置 3.请求时通过http头传给后端 4.前端可读写 5.遵守同源策略 二.Cookies内容 1.域名 2.有效期,删除cookie ...

  2. [Web前端]由cookies安全说开去

    在Web应用中,Cookie很容易成为安全问题的一部分.从以往的经验来看,对Cookie在开发过程中的使用,很多开发团队并没有形成共识或者一定的 规范,这也使得很多应用中的Cookie成为潜在的易受攻 ...

  3. 前端使用crypto.js进行加密

    前端使用crypto.js进行加密 https://www.cnblogs.com/lz2017/p/8046816.html   最近我在前端使用Cookies保存密码的时候需要前端来进行加密工作, ...

  4. >>我要到处浪系列 之 JS随便投票小脚本

    首先郑重声明:我不是对任何网站或者任何个人或组织有意见,仅仅是觉得 4点几 的评分对某些玩票的片段都太高了,为了落实想法,切实履行公民的投票权,并且 bibibabibobi biubiubiu..所 ...

  5. Flask - 请求响应 | session | 闪现 | 请求扩展 | 中间件

    请求响应 flask的请求信息都在request里 flask的响应方式有四剑客,也可以自定义响应 请求相关信息 # request.method 提交的方法 # request.args get请求 ...

  6. koa 实现session登陆

    在我们访问一些网站内部内容的时候,通常都会先验证我们是否已经登陆,如果登陆了就跳转到内容页面否则就跳转或者弹出登陆页面. 但是HTTP协议是没有状态的协议,无法标识一个用户的登录状态. 于是Cooki ...

  7. 项目前端 - vue配置 | axios配置 | cookies配置 | element-ui配置 | bootstrap配置

    vue项目创建 环境 1.傻瓜式安装node: 官网下载:https://nodejs.org/zh-cn/ ​ 2.安装cnpm: >: npm install -g cnpm --regis ...

  8. cookies,sessionStorage和localStorage的区别---web前端sessionStorage和localStorage区别

    sessionStorage用于本地存储一个会话(session)中的数据,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁.因此sessionStorage不是一种持久化的本地 ...

  9. 【干货分享】前端面试知识点锦集01(HTML篇)——附答案

    一.HTML部分 1.浏览器页面有哪三层构成,分别是什么,作用是什么? 构成:结构层.表示层.行为层分别是:HTML.CSS.JavaScript作用:HTML实现页面结构,CSS完成页面的表现与风格 ...

随机推荐

  1. Treap基本用法总结

    Treap=Tree+Heap  起名的人非常有才 Treap是啥? 一棵二叉搜索树可能退化成链,那样各种操作的效率都比较低 于是可爱的Treap在每个节点原先值v的基础上加了一个随机数rnd,树的形 ...

  2. Client API Object Model - Grid Context(3.3)

    Grids 网格,以表格的形式显示数据, 网格可以跨越整个form,也可以是form中的一项. 被称为子网格(subgrid). grid有两种, 一种是read-only grid, 另一种是edi ...

  3. pycharm 固定模板使用者和日期

    如上图修改就可以正常修改模板了修改后每创建一个python文件就会是这种效果

  4. artTemplate--模板使用自定义函数(1)

    案例 因为公司业务需要频繁调用接口,后端返回的都是json树对象,需要有些特殊的方法做大量判断和数据处理,显然目前简单语法已经不能满足业务需要了,需要自己定制一些 方法来处理业务逻辑. 例如后台返回的 ...

  5. 暑假第三周总结(学习HDFS操作方法)

    本周由于自己出去玩,以及家里的各种事也没好好看书,就对HDFS的一些常用的shell命令进行了学习与应用,观看了林子雨老师关于HDFS的视频,对HDFS的一些存储的原理.规则进行了一定的了解.对uba ...

  6. Flutter 入门 --- 内部分享

    八月部门给分配的分享任务,由于项目太赶,推迟一个月. 选 Flutter 这个主题,是因为现在它慢慢流行起来了,而我却不了解,故而借此契机,上手试试. 简介 Flutter 是 Google 推出的跨 ...

  7. (五)myBatis架构以及SQlSessionFactory,SqlSession,通过代理执行crud源码分析---待更

    MyBatis架构 首先MyBatis大致上可以分为四层: 1.接口层:这个比较容易理解,就是指MyBatis暴露给我们的各种方法,配置,可以理解为你import进来的各种类.,告诉用户你可以干什么 ...

  8. TestStand 基础知识[7]--Build-in Step Types (2)

    接着上一篇文章:TestStand 基础知识[6] Build-In StepTypes(1) 继续介绍: 还是先把Build-in StepTypes图片贴一下, 1. Call Executabl ...

  9. Go语言实现:【剑指offer】和为S的两个数字

    该题目来源于牛客网<剑指offer>专题. 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 对应每个测试案 ...

  10. Go语言实现:【剑指offer】整数中1出现的次数(从1到n整数中1出现的次数)

    该题目来源于牛客网<剑指offer>专题. 求出1 ~ 13的整数中1出现的次数,并算出100 ~ 1300的整数中1出现的次数?为此他特别数了一下1 ~ 13中包含1的数字有1.10.1 ...