前端Cookies问题

Cookies特性

前端数据存储 后端可以通过HTTP头设置 请求时通过HTTP头传给后端 前端可读写 遵守同源策略

前端读

doucment.cookie

前端写

doucment.cookie="userId = 2"

cookies特性

域名
有效期
路径
http-only
sucure

cookie没有提供删除方法,删除是通过设置有效期为过去的时间。

var now = new Date();
now.toGMTString();
// "Mon, 28 Aug 2017 08:31:06 GMT"

document.cookie = 'aaa = 1; expires="Mon, 28 Aug 2018 08:31:06 GMT"'

expires 值应该使用 GMT 格式的时间

Cookies作用

存储个性化设置(用户选的皮肤、上次打开的菜单、上次停留在某个页面)
存储未登录时用户唯一标识
存储已登录用户的凭证
存储其他业务数据

Cookies-登录用户凭证

前端提交用户名和密码
后端验证用户名和密码
后端通过HTTP头设置用户凭证
后续访问时后端先验证用户凭证

用户ID
用户ID + 签名(使用nodejs的crypto)
SessionId(像一把钥匙,去开仓库再取到用户ID)
token

var crypt = {};
const KEY = '#dsfda';

crypt.cryptUserId = function(userId) {
  var crypto = require('crypto');
  var sign = crypto.createHmac('sha256', KEY);
  sign.update(userId + '');
  return sign.digest('hex');
};
module.exports = crypto;

后端验证前端传入的sign是否正确,如果篡改了用户ID,但是没法拿到算法,签名不变,与后端重新算出来的sign不匹配,验证不通过。

Cookies和XSS CSRF的关系与案例

Cookies和XSS的关系

XSS可能偷取Cookies
http-only的Cookie不会被偷

Cookies和 CSRF的关系

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

cookies安全案例

❶ 某学校教务系统使用了开源CMS
该CMS使用username作为唯一用户标识
该CMS文章作者暴露了username
可使用任意username登录后台

❷ 某论坛使用了某开源ASP BBS程序
该ASP程序使用用户ID作为用户标识
可伪造任意用户登录

Cookies安全策略

签名防篡改
私有变换(加密)
http-only(防止XSS)
secure
same-site

加密

var crypto = require('crypto');
var KEY = '78&*fdsaf^*sfd';
var cipher = crypto.createCipher('des', KEY);
var text = cipher.update('hello world', 'utf8', 'hex');
text += cipher.final('hex');

console.log(text);

var decipher = crypto.createDecipher('des', KEY);
var originalText = decipher.update(text, 'hex', 'utf8');
originalText = decipher.final('utf8');

console.log(originalText);

前端点击劫持问题-Click hijacking

点击劫持演示-demo

在攻击网页上,通过iframe引入被攻击网页,并设置被攻击的iframe透明度为0,用户以为操作的是攻击网页,实际上是操作(点击)了被攻击网页iframe,这样攻击就产生了。

一句话,被攻击的网页被内嵌了。

用户亲手操作
用户不知情
盗取用户资金(转账、消费)
获取用户敏感信息

clickhijack.html

<!doctype html>
<html>
	<head>
		<meta charset="utf-8"/>
		<title>csrf demo</title>
	</head>
	<body style="background:url(clickhijack.png) no-repeat">
		<iframe style="opacity:.1" src="http://localhost:1521/post/1" width="800" height="600"></iframe>
	</body>
</html>

点击劫持防御-Click hijacking defense

javascript 禁止内嵌
X-FRAME-OPTIONS 禁止内嵌
其他辅助手段

javascript 禁止内嵌

if (top.location !== window.location) {
  top.location = window.location;
}

js不能100%防御成功

<body style="background:url(clickhijack.png) no-repeat">
  <iframe style="opacity:.1" src="http://localhost:1521/post/1" width="800" height="600" sandbox="allow-forms"></iframe>
</body>

X-FRAME-OPTIONS 禁止内嵌

ctx.set('X-Frame-Options', 'DENY');

推荐使用的手段

其他辅助手段 验证码

传输安全-Transmission security

HTTP窃听

HTTP传输窃听

浏览器 < - > 代理服务器 < - > 链路 < - > 服务器

查看访问服务器中间经过哪些? ❶

traceroute  pengyouyi.site
traceroute localhost

AnyProxy是一个开放式的HTTP代理服务器

anyproxy安装

npm install -g anyproxy

启动anyproxy

anyproxy

❸ chrome浏览器插件
Proxy SwitchyOmega

配置

代理协议:HTTP
代理服务器:localhost
代理端口:8001
不代理的地址列表:空
然后应用选项

HTTP窃听危害

窃听用户密码
窃听传输敏感信息
非法获取个人资料

HTTP篡改危害

插入广告
重定向网站
无法防御的XSS和CSRF攻击

HTTPS原理


      | -----------------------------  |
浏览器 |< - > 代理服务器 < - > 链路 < - > | 服务器
      | ------------------------------ |

TLS(SSL)加密

Transport Layer Security,传输层安全协议

Secure Socket Layer,安全套接字层

HTTPS部署

https://www.sslforfree.com/

密码安全-Password security

密码的作用
密码的存储
密码的传输
密码的替代方案
生物特征密码的问题

密码的作用

证明你是你

密码 - 比对

存储的密码 <-对比-> 输入的密码

密码的存储

密码 - 泄露渠道

数据库被偷
服务器被入侵
通讯被窃听
内部人员泄露数据
其他网站(撞库)

密码 - 存储

严禁明文存储(防泄露)
单向变换(防泄露)
变换复杂度要求(防猜解)
密码复杂度要求(防猜解)
加盐(防猜解)

密码 - 哈希算法

明文 - 密文 一一对应
雪崩效应
密文 - 明文 无法反推
密文固定长度
常见哈希算法: md5、sha1、sha256

密码 - 单向变换彩虹表

md5(明文) = 密文
md5(md5(明文)) = 密文
md5(sha1(明文)) = 密文
md5(sha256(sha1(明文))) = 密文

密码 - 帮助用户加强复杂度

ID 原始密码 变换后密码
1 123456 A7D3E9… d8ds3d…

md5(sha1(md5(ID + adf + 原始密码 + f8s + 盐 + fd93)))

密码 - 变换次数越多越安全 加密成本几乎不变(生成密码时速度慢一些)
彩虹表失效(数量太大,无法建立通用性)
解密成本增大N倍

密码加固

如果用户密码没有加盐,我们自动加盐(时间戳)然后存储更新老密码,临时存储用户原始密码和盐,只需要比对用户传来的盐和原始密码计算出新密码与数据库里存储的更新密码比较。

不用比对明文密码,即使数据库泄露,攻击者也不知道原密码。

密码传输安全

HTTPS传输
频率限制
前端加密意义有限

前端加密后传输,后端也需要用同样的算法加密比对。

生物密码

指纹(唇纹)
声纹
虹膜
人脸

密码 - 生物特征密码

私密性 - 容易泄露
安全性 - 碰触
唯一性 - 终身唯一 无法修改

接入层注入问题- injection problem

关系型数据库和SQL介绍

存放结构化数据
可高效操作大量数据
方便处理数据之间的关联关系

常见:access、sqlite、MySQL、MySQL server

SQL语言
select * from table where id = 1
标准化类似自然语言的描述性语言
用于关系型数据库

SQL注入前置知识

1

select * from table where id = ${id};

用户传入 1 or 1 = 1

select * from table where id = 1 or 1 = 1;

2

select * from user where username = '${data.username}' and password = '${data.password}'

用户传入 1' or '1' = '1

select * from user where username = '${data.username}' and password = '1' or '1' = '1'

SQL注入演示和危害

猜解密码
获取数据
删库删表
拖库

SQL注入防御

关闭错误输出
检查数据类型
对数据进行转义
使用参数化查询(MySQL2最根本、直有效、简单的方法)
使用ORM(对象关系映射)

NoSQL注入和防御

检查数据类型
类型转换
写完整条件

接入层上传问题

上传漏洞简介-upload

上传问题

  1. 上传文件
  2. 再次访问上传的文件
  3. 上传的文件被当成程序解析

上传问题防御

  1. 限制上传后缀
  2. 文件类型检查
  3. 文件内容检查
  4. 程序输出(不让用户输出的能直接访问)
  5. 权限控制 - 可写可执行互斥

社会工程学和信息泄露

信息泄露和社会工程学

泄露系统敏感信息
泄露用户敏感信息
泄露用户密码

信息泄露的途径

错误信息失控
SQL注入
水平权限控制不当

其他安全问题

 DOS攻击

其他安全问题

拒绝服务DOS
重放攻击

拒绝服务攻击DOS

模拟正常用户
大量占用服务器
无法服务正常用户

DOS类型

TCP半连接
HTTP连接
DNS

大规模分布式拒绝服务攻击DDOS

流量可达几十到上百G
分布式(肉鸡、代理)
极难防御

DOS攻击案例

  1. 游戏私服互相DDOS
  2. 换目标,攻击DNS服务器
  3. DNS服务器机器下线
  4. 数十万网站DNS解析瘫痪
  5. 暴风影音后台疯狂请求解析
  6. 各地local DNS瘫痪 无法上网

DOS攻击防御

防火墙
交换机、路由器
流量清洗
高防IP

DOS攻击预防

避免重逻辑业务
快速失败快速返回
防雪崩机制
有损服务
CDN

重放攻击-Replay attack

请求被窃听或记录
再次发起相同的请求
产生意外的结果

重放攻击后果

用户被多次消费
用户登录态被盗取
多次抽奖

重放攻击防御

加密(HTTPS)
时间戳
token(session)
nonce
签名

课程总结-Course summary

请简述XSS的原理

用户的数据(文章、评论、浏览器访问的参数)被当成脚本在页面中执行了

请简述XSS的防御方法

浏览器自动拦截
转义
白名单过滤
csp

XSS防御需要注意的点

场景和对应的防御方法

CSRF原理是什么

CSRF的危害是什么

CSRF如何防御

验证码
token
refer

Cookie的作用

Cookie和session的关系

Cookie的特性

容量小
不能跨域
path不同,Cookie不同
有限期

如何删除一个Cookie值

设置Cookie过期时间为一个过去是时间

HTTPS是如何保证数据不被窃听的

数据加密

HTTPS是如何保证不被中间人攻击

证书CA

部署HTTPS的步骤 保证所有资源都可以通过HTTPS访问
找CA生成证书
部署到服务器上

SQL注入的原理是什么

用户查询条件本应该为数据,数据变成查询语句本身的一部分,查询语句语义被改变,从而产生意外结果。

SQL注入有哪些危害

Node.js中如何防止SQL注入

转义
数据关系模型
参数化查询,两步骤执行

PHP中如何防止SQL注入

文件上传漏洞的原理

如何防范文件上传漏洞

如何设计用户密码存储

不用明文存储

如何设计登录过程

如何保证用户密码不被窃听