这是我参与「第四届青训营 」笔记创作活动的第1天
1. 攻击篇
- xss攻击:
- 特点:
- 通常难以从ui上感知(暗地执行脚本)
- 窃取用户信息(cookie/token)
- 绘制ui(例如弹窗),诱骗用户点击/填写表单
- stored XSS
- 恶意脚本本存在数据库中
- 用户访问页面,读取数据就会被攻击
- 危害最大,对全部用户可见
- Reflected xss
- 不涉及数据库,
- 从url上攻击
- DOM-based xss
- 不需要服务器参与
- 恶意攻击的发起+执行,全在浏览器完成
- Mutation-based xss
- 利用浏览器渲染DOM的特性(独特优化)
- 不同浏览器,会有区别(按浏览器进行攻击)
- 特点:
- Cross-site request forgery (CSRF)攻击:
-
特点:
- 在用户不知情的前提下
- 利用用户权限(cookie)
- 构造指定http请求,窃取或修改用户敏感信息
-
CSRF-GET/POST请求
攻击者只需要构造GET请求按钮、POST请求表单即可。
-
injection攻击:
- 通常直接在请求体中写SQL参数或者SQL命令,已达到清除数据库、修改数据的目的。
- 不仅可以用于SQL服务端,在CLI脚手架、OS命令行等都可以运用。
- SSRF(Server-Side Request Forgery)服务端伪造请求,严格来说不算注入,但原理相似。
-
SSRF:
- 请求【用户自定义】的callback url
- webserver通常有内网访问权限
-
Denial of Service(DOS) 通过某种方式(构造特定请求),导致服务器资源被显著消耗,来不及响应更多请求,导致请求挤压,进而雪崩效应
-
2. 防御篇
-
xss
- 永远不信任用户提交的内容,
- 不要将用户提交的内容直接转换成dom
- 前端主流框架默认防御xss
- google-closure-library
- 服务端(node)
- DOMPurify
- 同源请求策略:
要求协议,域名,端口号与服务端一致 - CSP:
- 哪些源(域名)被认为是安全的
- 来自安全源的脚本可以执行,否则直接抛错
- 对eval+inline script说no
- csrf:
- if伪造请求===异常来源
- then 限制请求来源→限制伪造请求
- origin 同源请求中,get+head不发送
- referer
- csrf-token防护
-
除了origin+referrer其他判断【请求来自于合法来源】的方式 -
if(请求来自合法页面) -
then(服务器接受过页面请求) -
then(服务器可以标识)
-
- csrf防护
-
避免GET接口和POST接口合并等偷懒行为 -
防护SameSite Cookie信息泄露,SameSite COokie依赖于第三方的Cookie请求,需要允许第三方域名采集Cookie -
防御CSRF需要注意逐级实施加权限制
-
-
Inject Protection
-
SQL防护
- 最小原则:避免使用sudo || root 命令
- 建立ip白名单+过滤,拒绝异常rm操作
- 对URL类型参数、域名、IP等限制
- 拒绝访问内网
-
防范DoS攻击:
-
Regex DoS
- 减少允许用户使用正则表达式请求
- 增加校验, 对代码做扫描 +正则性能测试
-
Logical-DoS
- 有些case,只有在请求量大道一定之后,才会体现
- 分析代码的性能瓶颈:同步调用、串行逻辑、CPU密集操作
- 限流
-
DDoS
- 过滤:负载均衡、API网关
- 抗量:CDN、快速扩容、 非核心服务降级备战
-
中间人防御
-
HTTPS特性: 可靠性-明文加密,完整性:MAC验证;不可抵赖性-数字签名
-
HTTPS加密:在三次握手时进行hash加密,利用公钥和证书进行数字签名校验。
-
将HTTP主动升级到HTTPS:需要之前要有一次HTTPS访问
-
当静态资源被劫持篡改了,可以运用SRI对资源做hash验证。
-
-
结尾:
- 安全无小事
- 使用的依赖(npm package ,甚至是nodejs)可能成为最薄弱的一环
- let-pad事件
- eslint-scope事件
- event-stream事件
- 保持学习心态