这是我参与「第四届青训营 」笔记创作活动的的第6天
安全问题会危害用户、公司、程序员
两个角度看Web安全
- 假如你是一个hacker —— 攻击
- 假如你是一个开发者 —— 防御
攻击篇
Cross-Site Scripting(XSS)
- XSS主要利用了程序员在编写代码中盲目信任用户提交的内容从而导致隐患
例如:在提交框内输入<script>alert('xss')</script>
XSS的一些特点
- 通常难以从UI上感知(暗地执行脚本)
- 窃取用户信息(cookie/token)
- 绘制UI(例如弹窗),诱骗用户点击/填写表单
Stored XSS
- 恶意脚本被存在数据中
- 访问页面 -> 读数据(被攻击)
- 危害最大,对全用户可见
Reflected XSS
- 不涉及数据库
- 从URL上攻击
- 在服务器中完成脚本注入
(例如:
?param=<script>alert(123)</script>)
DOM-based XSS
- 不需要服务器的参与
- 恶意攻击的发起和执行全在浏览器完成
Mutation-based XSS
- 利用了浏览器渲染DOM的特性(独特优化)
- 不同浏览器,会有区别(按浏览器进行攻击)
Cross-site request forgery(CSRF)
- 在用户不知情的前提下
- 利用用户权限(cookie)
- 构造指定HTTP请求,窃取或修改用户敏感信息
Injection
- SQL Injection
Denial of Service(Dos)
通过某种方式(构造特定请求),导致服务器资源被显著消耗,来不及响应更多请求,导致请求挤压,进而雪崩效应。
Logical DoS
- 耗时的同步操作
- 数据库写入
- SQL join
- 文件备份
- 循环执行逻辑
Distributed DoS(DDoS)
短时间内,来自大量僵尸设备的请求流量,服务器不能及时完成全部请求,导致请求堆积,进而雪崩效应,无法响应新请求。
攻击特点
- 直接访问IP
- 任意API
- 消耗大量带宽(耗尽)
传输层
中间人攻击
Browser和Serve在进行信息传输的过程中会经过一个中间人,如果中间人是恶意攻击,那么就会产生窃取信息,修改请求、返回等等安全隐患。
隐患产生原因
- 明文传输
- 信息篡改不可知
- 对方身份未验证
防御篇
XSS
解决方法
- 永远不信任用户的提交内容
- 不要将用户提交的内容直接转换成DOM
XSS —— 现成工具
前端
- 主流框架默认防御XSS
- Google-closure-Library
服务器(Node)
- DOMPurify
会发生XSS的几种情况
- string -> DOM
- 上传svg
- Blob动态生成script
- 自定义跳转链接
- 自定义样式
CSRF
xss利用站点内的信任用户,而CSRF则通过伪装成受信任用户请求受信任的网站。
防御方法
- 验证用户:当用户发送重要的请求时需要输入原始密码或验证码
- 限制请求方式:限制请求方式只能为POST
- 只使用JSON API
- 验证HTTP Referer字段(同源策略)
- 在请求地址中添加token验证
DOS
最常见的DoS攻击有计算机网络宽带攻击和连通性攻击。
防御方法
- 定期扫描
- 配置防火墙
- 优化服务器端口:当服务器端口全都开放时,不常使用的端口就会变成黑客攻击的切入点,因此,将不必要的服务和端口关闭,只开放正在使用的端口是一个不错的方法。
- 部署高防服务器