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. 安装mysql遇到的问题

    想在自己的PC上安装mysql服务器,首先在官网下载mysql的安装文件. MySQL安装文件分两种 .msi和.zip ,.msi需要安装,.zip文件需要配置环境变量. 我首先下载的是不需要安装的 ...

  2. 【Java面试】java基础篇

    总结个人的面试经历以及一些网上的的面试题,以供以后面试与巩固java基础. 1.String.StringBuilder和StringBuffer的区别 String用于存储不可变字符串的类,Stri ...

  3. ubuntu文件操作mkdir cp mv rm ln

    pwd:显示当前目录 date:显示当前日期 cal:显示日历 ls:列出目录内容 cd:改变当前工作目录 ‘.’:代表工作目录 ‘..’:代表工作目录父目录 进入当前目录的父目录:cd /home ...

  4. BZOJ 2648 世界树

    题目传送门 分析: 喜 闻 乐 见 的虚树 但是建好虚树后的DP也非常的恶心 我们先考虑每个关键点的归哪个点管 先DFS一次计算儿子节点归属父亲 再DFS一次计算父亲节点归属儿子 然后然后我们对于虚树 ...

  5. nuxt.js学习初探

    项目目标 把我个人博客的前端界面部分使用nuxt框架进行服务端渲染 nuxt介绍 nuxt可以把spa根据路由将单页面分割成多页面,比起vue的ssr渲染要更容易使用 nuxt的使用 项目创建 npx ...

  6. 科普文,搭建python开发环境

    Python简介!首先,是一门面向对象的程序设计语言,先说3个优点!1.有条理,简单,易学,易用.2.强大!可以把其他编程语言制作的模块利用起来.3.拥有丰富的库.Python作为高级编程语言,拥有的 ...

  7. mysql 记录一次内存清理

    摘自:https://blog.csdn.net/wyzxg/article/details/7279986/ 摘要:Linux对内存的管理与Windows不同,free小并不是说内存不够用了,应该看 ...

  8. Python报错:PermissionError: [Errno 13] Permission denied

    问题分析: 错误产生的原因是文件无法打开,可能产生的原因是文件找不到,或者被占用,或者无权限访问,或者打开的不是文件,而是一个目录. 问题解决: 1.检查对应路径下的文件是否存在,且被占用.如果文件不 ...

  9. 使用 FRP 让部门同事都能直接远程桌面办公( 适用于 TEAM 和向日葵卡顿的用户)

    背景说明 这两天由于疫情的原因,很多公司都得在家远程上班,然后像我们这类小公司有没有 VPN 这些东西.传统的远程回公司只能依靠 Teamviewer 或者向日葵等工具.但是由于最近用户量很多,可能会 ...

  10. 开源项目SMSS发开指南(五)——SSL/TLS加密通信详解(下)

    继上一篇介绍如何在多种语言之间使用SSL加密通信,今天我们关注Java端的证书创建以及支持SSL的NioSocket服务端开发.完整源码 一.创建keystore文件 网上大多数是通过jdk命令创建秘 ...