这是我参与「第四届青训营 」笔记创作活动的第13天
Web开发安全之旅
安全问题危害:
- 用户
- 公司
- 程序员(祭天)
假如你是一个hacker--攻击
Cross-site-Scripting(xss)
特点
- 通常难以从UI上感知(暗地执行脚本)
- 窃取用户信息
- 绘制用户信息(cookie/token)
demo
public async submit(ctx)
const content,id ctx.request.body;
//没有对content过滤
await db.save({
content,
id
});
}
public async render(ctx)
const {content} = await db.query({
id:ctx.query.id
});
//没有对content过滤
ctx.body = `<div>${content}</div>`
}
Stored XSS
- 恶意脚本被存在数据库中
- 访问页面 -> 读数据 === 被攻击
- 危害最大,对全部用户可见
Reflected XSS
不涉及数据库
从URL上攻击
public async render(ctx) {
const {param} = ctx.query;
ctx.status 200;
ctx.body =`<div>${param}</div>;`
}
DOM-based XSS
不需要服务器的参与
恶意攻击的发起+执行,全在浏览器完成
Mutation-based XSS
利用了浏览器渲染D0M的特性(独特优化)
不同浏览器,会有区别(按浏览器进行攻击)
Cross-site request forgery(CSRF)
在用户不知情的前提下
利用用户权限(cookie)
构造指定HTTP请求,窃取或修改用户敏感信息
SQL Injection
Injection不止于SQL
- CLI
- OS command
- Server-Side Request Forgery(SSRF)服务端伪造请求
-
- 严格而言,SSRF不是injection,但是原理类似
Denial of Service(DoS)
通过某种方式(构造特定请求),导致服务器资源被显著消耗,来不及响应更多请求,导致请求挤压,进而雪崩效应。
Logical DoS
耗时的同步操作
数据库写入
SQL join
文件备份
循环执行逻辑
Distributed DoS(DDoS)
短时间内,来自大量僵尸设备的请求流量,服务器不能及时完成全部请求,导致请求堆积,进而雪崩效应,无法响应新请求。
攻击特点:
直接访问IP
任意API
消耗大量带宽(耗尽)
中间人攻击
明文传输
信息篡改不可知
对方身份未验证
防御
永远不信任用户的提交内容
不要将用户提交内容直接转换成D0M
XSS
前端:
主流框架默认防御XSS
google-closure-library
服务端(Node): DOMPurify
-
string->DOM
-
上传svg
-
Blob动态生成script
-
自定义跳转链接
-
自定义样式】
Content Security Policy(CSP)
哪些源(域名)被认为是安全的
来自安全源的脚本可以执行,否则直接抛错
对eval+inline script说NO
CSRF的防御
CSRF--token
除了Origin+Referrer
其他判断【请求来自于合法来源】的方式:
现有页面后有请求
- if(请求来自合法页面)
- then(服务器接收过页面请求)
- then(服务器可以标识)