这是我参与「第四届青训营 」笔记创作活动的的第7天,记录一下昨天上课关于Web开发中安全问题的相关内容。
一、本节课重点内容
- 攻击篇:XSS、CSRF、注入、DoS等攻击方式
- 防御篇:针对各类攻击方式实行相应的防御策略
二、详细知识点介绍
1. 攻击篇
- 跨站脚本攻击(Cross-Site Scripting,XSS)
- 原因:盲目信任用户提交的内容,如直接将用户提交的字符串转换成 DOM
- 特点:
- 难以从 UI 上感知
- 窃取用户信息(cookie/token)
- 绘制 UI(如弹窗等),诱骗用户点击和提交表单
- 分类:
- 存储型 XSS(Stored XSS):恶意脚本存在数据库中
- 反射型 XSS(Reflected XSS):恶意脚本存在 URL 中
- 基于 DOM 的 XSS(DOM-Based XSS):与反射型 XSS 相似,但不需要服务器的参与
- Mutation-Based XSS:利用浏览器渲染 DOM 的特性进行攻击,针对不同的浏览器会有区别
- 跨站伪造请求(Cross-Site Request Forgery,CSRF)
- 特点:在用户不知情的情况下,利用用户权限(cookie),构造指定 HTTP 请求,窃取和修改用户敏感信息
- 注入(Injection)
- 分类:
- SQL 注入(SQL Injection)
- CLI 注入(CLI Injection)
- 命令行注入(OS Command Injection)
- 服务端伪造请求(Server-Side Request Forgery,SSRF)
- 分类:
- DoS(Denial of Server)
- 特点:攻击者通过构造特定请求,导致服务器资源被显著消耗,导致请求挤压,进而雪崩效应
- 分类:
- 基于正则表达式的 DoS(ReDoS):利用正则表达式中贪婪匹配的回溯行为进行攻击
- DDoS(Distributed DoS):短时间内向服务器发送大量来自僵尸设备的请求,服务器不能及时完成全部请求,导致请求堆积
- 中间人攻击
- 原因:
- 明文传输
- 信息篡改不可知
- 对方身份未验证
- 原因:
2. 防御篇
- XSS
- 不要将用户提交的内容直接转换成 DOM,主流默认框架都默认防御 XSS 攻击
- 如果一定需要将用户提交的内容转换成 DOM,则需要对内容进行转义(需要注意:SVG 中也可以存在脚本)
- 避免用户自定义的链接跳转
- 避免用户自定义的样式
关于浏览器的安全策略:
- 同源策略(Same-Origin Policy):只有同源(协议、域名、端口相同)的 URL 能相互访问
- 内容安全策略(Content Security Policy,CSP):开发者可以定于哪些源是安全的,只有来自安全源的脚本可以执行,如:
- 通过响应头设置:
Content-Security-Policy: script-src 'self' http://domain.com表示只有当前域名和 domain.com 域名下的脚本可以执行- 通过 meta 标签设置:
<meta http-equiv="Content-Security-Policy" content="script-src self http://domain.com">
- CSRF
- 使用 token 进行验证
- 设置
X-Frame-Options: DENY/SAMEORIGIN防御 iframe 攻击(iframe 中可以发送相对于其自身同源的请求) - 使用 Same-Site Cookie 避免用户信息被携带
- DDoS
- 流量治理
- 负载均衡
- API 网关
- CDN
- 快速自动扩容
- 非核心服务降级
- 流量治理
- 中间人攻击
- 使用 HTTPS 协议
- 可靠性:加密
- 完整性:MAC 验证
- 不可依赖性:数字签名
- 使用 HTTPS 协议
三、课后个人总结
这节课上老师介绍了 Web 中常见的几类攻击方式并且讲解了对应的防御策略。在实际开发过程中,我们应该在编码时保持谨慎,在后期 Review 时全面地考虑问题,同时积极地学习关于网络安全的新知识,以避免安全漏洞的出现。