这是我参与「第四届青训营 」笔记创作活动的的第6天
二、防守篇
XSS
- 永远不信任用户的提交内容
- 不要将用户提交内容直接转换成 DOM
现成工具
前端
- 主流框架默认防御XSS
- google-closure-library
服务端(Node)
- DOMPurify
有时候用户需求必须生成动态dom
例如:
- string->DOM
- 上传svg
- blob动态生成script
- 自定义跳转链接
- 自定义样式
Tips:Same-origin policy
CSP(content security policy)
- -哪些源(域名)被认为是安全的
- -来自安全源的脚本可以执行,否则直接抛错
- -对eval+inlinescript说NO!
服务器的响应头部
浏览器meta
CSRF的防御
- if伪造请求->异常来源
- then限制请求来源->限制伪造请求
3.请求头部
- Origin
- 同源请求中,GET+HEAD不发送
- Referer
token
先有页面,后又请求
除了 Origin + Referrer其他判断【请求来自于合法来源】的方式
- if(请求来自合法页面)
- then(服务器接收过页面请求)
- then(服务器可以标识)
- 用户绑定:攻击者也可以是注册用户===可以获取自己的token
- 过期时间:【前向保密】
iframe攻击
deom:codesandbox.io/s/boring-pt…
anti-pattern
GET!==GET+POST
same-site cooike
限制的是
- cooike domain
- 页面域名
依赖Cookie的第三方服务怎么办?
内嵌一个X站播放器,识别不了用户登录态,发不了弹幕
SameSite vs CORS
CORS
- -资源读写(HTTP请求)
- -资源域名vs页面域名
- -白名单
SameSite
- Cookie发送
- domain vs 页面域名
- "我跟你说个事儿,
- 出这屋我可就不认了"
SameSite demo
demo:csb-mnlu0-liuyuchenzh.vercel.app/
SameSite Cooike
正确防御CRSF
Injection
- 找到项目中查询SQL的地方
- 使用preparedstatement
Injection beyond SQL
1.最小权限原则
- sudo II root
2.建立允许名单+过滤
- rm
3.对URL类型参数进行协议、域名、ip等限制
- 访问内网
正确防御DOS
Regex DOS
- code review(X/(ab*)+/)
- 代码扫描+正则性能test
- X用户提供的使用正则
Logical DOS
1.不是非黑即白
- 有些case,只有在请求量大到一定之后,才会体现
2.分析代码中的性能瓶颈
- 同步调用(缓存?)
- 串行逻辑(缓存?)
- CPU密集型操作
3.限流
DDOS
1.过滤
- 流量治理
- 网关
- API
- CDN
2.抗量
- 快速自动扩容
- 非核心服务降级
防御中间人
http3内置了tls1.3
HTTP一些特性
- 可靠性:加密
- 完整性:MAC验证
- 不可抵赖性:数字签名
tls握手(1.2版)
完整性
Tips:数字签名(不可抵赖)
签名算法不够健壮时,会被暴力破解
将HTTP升级到HTTPS
SRI(Subresource Intergity)
原始hash vs 实际hash
补充
- 安全无小事
- 使用的依赖可能是最薄弱的一环
- 保持学习心态
leftpad:blog.npmjs.org/post/141577… esllint scope:eslint.org/blog/2018/0… event stream:eslint.org/blog/2018/0…