这是我参与「第四届青训营 」笔记创作活动的第11天
web安全一窥
安全问题是很常见的,会危害用户、公司、程序员(祭天)
从两个角度看web安全——攻击、防御
攻击篇
XSS攻击:Cross-site Scripting
没有将用户提交内容进行过滤/转义,直接转化成 DOM
XSS的一些特点:
- 通常难以从UI上感知(暗地执行脚本)
- 窃取用户信息(cookie/token)
- 绘制UI(例如弹窗),诱骗用户点击/填写表单
xss demo
public async submit(ctx){
const { content,id } = ctx.request.body
await db.save({
content,
id,
})
}
public async render(ctx){
const { content } = await db.query({
id:ctx.query.id
})
ctx.body = `<div>${content}</div>`
}
可以恶意提交脚本
fetch("/submit",{ body:JSON.stringify({ id:'1', content:`<script>alert("xss")</script>` }) })
stored XSS
- 恶意脚本被存在数据库中
- 访问页面-读数据-被攻击
- 危害最大,对全部用户可见
Reflected XSS
-
不涉及数据库
-
从URL上攻击
host/path/?param=
DOM-based XSS
- 不需要服务器的参与
- 恶意攻击的发起+执行,全在浏览器
Reflected与DOM-based的不同
完成注入脚本的地方不一样
mutation-based XSS
- 利用了浏览器渲染dom的特性,独特优化
- 不同浏览器,会有区别(按不同浏览器进行攻击)
CSRF攻击:Cross-site request forgery
- 用户没有访问银行页面
- 银行页面中的特定接口被请求
- 请求执行成功
Injection
DoS:Denial of Service
通过某种方式(构造特点请求),导致服务器资源被显著的消耗,来不及响应更多的请求,导致请求挤压,进而雪崩效应
ReDoS:基于正则表达式的DoS
贪婪模式:n次不行?n-1次再试试?——回溯
Logical DoS
- 耗时的同步操作
- 数据库写入
- SQL join
- 文件备份
- 循环执行逻辑
DDoS:Distributed DoS
短时间内,来自大量僵尸设备的请求流量,服务器不能即使完成全部请求,导致请求堆积,进而雪崩效应,无法响应新请求。
不搞复杂的,量大就完事了
- 直接访问IP
- 任意API
- 消耗大量带宽