前端Cookies问题、前端点击劫持问题、传输安全、密码安全、SQL注入
前端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安装
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部署
密码安全-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
上传问题
- 上传文件
- 再次访问上传的文件
- 上传的文件被当成程序解析
上传问题防御
- 限制上传后缀
- 文件类型检查
- 文件内容检查
- 程序输出(不让用户输出的能直接访问)
- 权限控制 - 可写可执行互斥
社会工程学和信息泄露
信息泄露和社会工程学
泄露系统敏感信息
泄露用户敏感信息
泄露用户密码
信息泄露的途径
错误信息失控
SQL注入
水平权限控制不当
其他安全问题
DOS攻击
其他安全问题
拒绝服务DOS
重放攻击
拒绝服务攻击DOS
模拟正常用户
大量占用服务器
无法服务正常用户
DOS类型
TCP半连接
HTTP连接
DNS
大规模分布式拒绝服务攻击DDOS
流量可达几十到上百G
分布式(肉鸡、代理)
极难防御
DOS攻击案例
- 游戏私服互相DDOS
- 换目标,攻击DNS服务器
- DNS服务器机器下线
- 数十万网站DNS解析瘫痪
- 暴风影音后台疯狂请求解析
- 各地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注入
文件上传漏洞的原理
如何防范文件上传漏洞
如何设计用户密码存储
不用明文存储
如何设计登录过程
如何保证用户密码不被窃听