前端的Cookies
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的更多相关文章
- 前端网络安全——Cookies
一.Cookies特性 1.前端数据存储 2.后端通过http头设置 3.请求时通过http头传给后端 4.前端可读写 5.遵守同源策略 二.Cookies内容 1.域名 2.有效期,删除cookie ...
- [Web前端]由cookies安全说开去
在Web应用中,Cookie很容易成为安全问题的一部分.从以往的经验来看,对Cookie在开发过程中的使用,很多开发团队并没有形成共识或者一定的 规范,这也使得很多应用中的Cookie成为潜在的易受攻 ...
- 前端使用crypto.js进行加密
前端使用crypto.js进行加密 https://www.cnblogs.com/lz2017/p/8046816.html 最近我在前端使用Cookies保存密码的时候需要前端来进行加密工作, ...
- >>我要到处浪系列 之 JS随便投票小脚本
首先郑重声明:我不是对任何网站或者任何个人或组织有意见,仅仅是觉得 4点几 的评分对某些玩票的片段都太高了,为了落实想法,切实履行公民的投票权,并且 bibibabibobi biubiubiu..所 ...
- Flask - 请求响应 | session | 闪现 | 请求扩展 | 中间件
请求响应 flask的请求信息都在request里 flask的响应方式有四剑客,也可以自定义响应 请求相关信息 # request.method 提交的方法 # request.args get请求 ...
- koa 实现session登陆
在我们访问一些网站内部内容的时候,通常都会先验证我们是否已经登陆,如果登陆了就跳转到内容页面否则就跳转或者弹出登陆页面. 但是HTTP协议是没有状态的协议,无法标识一个用户的登录状态. 于是Cooki ...
- 项目前端 - vue配置 | axios配置 | cookies配置 | element-ui配置 | bootstrap配置
vue项目创建 环境 1.傻瓜式安装node: 官网下载:https://nodejs.org/zh-cn/ 2.安装cnpm: >: npm install -g cnpm --regis ...
- cookies,sessionStorage和localStorage的区别---web前端sessionStorage和localStorage区别
sessionStorage用于本地存储一个会话(session)中的数据,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁.因此sessionStorage不是一种持久化的本地 ...
- 【干货分享】前端面试知识点锦集01(HTML篇)——附答案
一.HTML部分 1.浏览器页面有哪三层构成,分别是什么,作用是什么? 构成:结构层.表示层.行为层分别是:HTML.CSS.JavaScript作用:HTML实现页面结构,CSS完成页面的表现与风格 ...
随机推荐
- 美食家App开发日记5
今天将ListView控件用更强大的Recyclerview控件取代,最后调试了程序. 感觉Android编程难度实在是远远高于javaweb,初次接触,感觉有很多东西想实现,想得很容易,但是实现起来 ...
- 玩转Django2.0---Django笔记建站基础八(admin后台系统)
第八章 admin后台系统 admin后台系统也成为网站后台管理系统,主要用于对网站前台的信息进行管理,如文字.图片.影音和其他日常使用文件的发布.更新.删除等操作,也包括功能信息的统计和管理,如用户 ...
- Client API Object Model - Grid Context(3.3)
Grids 网格,以表格的形式显示数据, 网格可以跨越整个form,也可以是form中的一项. 被称为子网格(subgrid). grid有两种, 一种是read-only grid, 另一种是edi ...
- composer intall 报错
报错 [Composer\Exception\NoSslException] The openssl extension is required for SSL/TLS protection but ...
- 小程序--->小程序图片上传阿里OSS使用方法
小程序图片上传阿里OSS使用方法 首先看下参考文档 ( http://blog.csdn.net/qq_38125123/article/details/73870667) 这里只将一些运用过程中遇到 ...
- Powershell下git中文乱码
问题 使用git log查看提交历史, 发现中文的部分出现了乱码, 如图 解决方案 powershell中输入下面的命令 git config --global core.quotepath fals ...
- jsp:useBean 不能编译成class或者没有class这个属性
bean.jsp <%-- JSP学习笔记 --%> <%@ page contentType="text/html;charset=UTF-8" languag ...
- Lua使用luasocket http请求例子
local http=require("socket.http"); local request_body = [[login=user&password=123]] lo ...
- selenium pyunit单元测试框架
selenium pyunit单元测试框架 #PyUnit框架 #coding = utf - 8 #将要被测试的类 class Widget: def __int__(self,size = (40 ...
- shell命令之一天一见:grep
一. 简介 grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来 ...