这是我参与「第四届青训营」笔记创作活动的的第7天
本堂课重点内容
- Web 安全
详细知识点介绍
两个角度看 Web 安全
攻击
-
Cross-Site Scripting(XSS)
XSS 主要利用了 开发者盲目信任用户的提交内容
-
XSS 的一些特点
-
通常难以从 UI 上感知(暗地执行脚本)
-
窃取用户信息(cookie/token)
-
绘制 UI(例如弹窗),诱骗用户点击/填写表单
-
Stored XSS
-
恶意脚本被存在数据库中
-
访问页面 -> 读数据 == 被攻击
-
危害最大,对全部用户可见
Reflected XSS
-
不涉及数据库
-
从 URL 上攻击
DOM-based XSS
-
不需要服务器的参与
-
恶意攻击的发起 + 执行,全在浏览器完成
Mutation-based XSS
-
利用了浏览器渲染 DOM 的特性(独特优化)
-
不同浏览器,会有区别(按浏览器进行攻击)
-
-
Cross-site request forgery(CSRF)
-
在用户不知情的前提下
-
利用用户权限(如cookie)
-
构造指定 HTTP 请求,窃取或修改用户敏感信息
-
-
Injection
SQL injection
-
请求:SQL 参数(恶意注入)
-
Server:参数 -> SQL 运行 SQL code
-
获取其他数据,修改数据,删除数据...
CLI
OS command
Server-Side Request Forgery(SSRF):服务端伪造请求
- 严格而言,SSRF 不是 injection ,但是原理类似
-
-
Denial of Service(Dos)
ReDos:基于正则表达式的 Dos
Distributed DoS(DDos)
短时间内,来自大量僵尸设备的请求流量,服务器不能及时完成全部请求,导致请求堆积,进而雪崩效应,无法响应新请求。
攻击特点
-
直接访问 IP
-
任意 API
-
消耗大量带宽(耗尽)
-
-
传输层
中间人攻击
-
明文传输
-
信息篡改不可知
-
对方身份未验证
-
防御
永远不信任用户的提交内容
- 不要将用户提交内容直接转换成 DOM
现成工具
-
前端
-
主流框架默认防御 XSS
-
google-closure-library
-
-
服务端(Node)
- DOMPurify
其他
-
String -> DOM 注意对 String 进行转义
-
对于用户上传 svg 的文件,要对其进行扫描
-
尽量不允许用户自定义跳转链接,同时要对其进行过滤
-
额外留意自定义样式
-
Same-origin Policy
-
Content Security Policy(CSP)
-
哪些源(域名)被认为是安全的
-
来自安全源的脚本可以执行,否则直接抛错
-
对 eval + inline script 说 NO
-
-
CSRF 的防御
-
if 伪造请求 == 异常来源
-
then 限制请求来源 -> 限制伪造请求
-
origin
- 同源请求中,GET + HEAD 不发送
-
Referer
-
token
-
请求页面
-
页面+token
-
请求 API + token
-
验证 token + 数据
-
token 必须与具体用户绑定
-
token 需要有过期时间
-
-
SameSite Cookie:避免用户信息被携带
-
-
Injection 的防御
-
找到项目中查询 SQL 的地方
-
使用 prepared statement
-
最小权限原则
-
建立允许名单 + 过滤
-
对 URL 类型参数进行协议、域名、ip 等限制
-
-
Dos 的防御
-
Regex Dos
-
Code Review
-
代码扫描 + 正则性能测试
-
拒绝使用用户提供的使用正则
-
-
DDoS
-
流量治理
-
负载均衡
-
API 网关
-
CDN
-
-
快速自动扩容
-
非核心服务降级
-
-
-
防御中间人
HTTPS
-
可靠性:加密
-
完整性:MAC 验证
-
不可抵赖性:数字签名
HTTP Strict-Transport-Security(HSTS)
Subresource Integrity(SRI)
-
总结
-
安全无小事
-
使用 的依赖(npm package,甚至是 NodeJS)可能成为最薄弱的一环
-
left-pad 事件
-
eslint-scope 事件
-
event-stream 事件
-
-
保持学习心态
课后个人总结
今天我们作为攻击者,学习了五种攻击方式,然后以防御者的身份思考如何避免掉这些攻击。正如老师所说,安全无小事,知己知彼百战百胜,由于目前我还在打基础的阶段,也没取得什么成就,实在谈不上经验分享。
引用参考
第四届字节跳动青训营「web 开发的安全之旅 」课程