这是我参与「第四届青训营」笔记创作活动的第2天。
05 Web开发安全
hacker —— 攻击篇
Cross-Site Scripting(XSS)
-
主要利用:
- 盲目信任用户的提交内容
- 将用户提交的string直接转换为DOM
-
特点
- 通常难以从UI上感知
- 窃取用户信息(cookie/token)
- 绘制UI,诱骗用户点击/填写表单
-
分类
-
存储型:
- 恶意脚本将被存在数据库中
- 访问页面 -> 读数据 -> 被攻击
- 危害最大,对全部用户可见
-
反射型:
- 不涉及数据库
- 从URL上攻击
-
基于DOM的攻击:
- 不需要服务器的参与
- 恶意攻击的发起+执行,全在浏览器完成
-
基于Mutation的攻击
- 利用浏览器渲染DOM的特性(独特优化)
- 不同浏览器会有区别(按浏览器进行攻击)
-
Cross-site request forgery(CSRF)
-
特点:
- 在用户不知情的前提下
- 利用用户权限(cookie)
- 构造指定HTTP请求,窃取或修改用户敏感信息
-
常见攻击方式:
- GET
- beyond GET
Injection
-
SQL Injection
- 请求SQL参数(恶意注入)
- Server参数 -> SQL运行SQL code
- 获取其他数据,修改数据,删除数据
-
不止于SQL
- CLI
- OS command
- Server-Side Request Forgery(SSRF) 服务端伪造请求(严格来讲不是注入攻击)
Denial of Service (Dos)
-
正则表达式的贪婪模式,带"?"即为关闭贪婪模式,不带"?"的正则表达式即为贪婪模式。处于贪婪模式的正则表达式会尽可能多的匹配字符
-
ReDoS:基于正则表达式的DoS
- n次不匹配则回溯到n-1次尝试,导致响应时间增加,接口吞吐量下降
-
Distributed Dos(DDoS)
-
短时间内来自大量僵尸设备的请求流量,服务器不能及时完成全部请求,导致请求堆积,进而雪崩效应,无法响应新请求。
-
攻击特点:
- 直接访问IP
- 任意API
- 消耗大量带宽
-
基于传输层的攻击
-
中间人攻击
- 明文传输
- 信息篡改不可知
- 对方身份未验证
防御篇
XSS
-
永远不信任用户的提交内容
-
不要将用户提交内容直接转换成DOM
-
现成工具:
-
前端
- 主流框架默认防御XSS
- google-closure-library
-
服务端(Node)
- DOMPurify
-
-
对于必须要将string转换成为DOM的情况:
- 对string进行转义
-
用户上传svg:
- 对svg文件进行一次扫描
-
自定义跳转链接:
- 尽量不要做允许用户自定义跳转链接的页面,即使要做也必须对自定义跳转链接做扫描
-
同源策略Same-origin Policy(SOP)
- 协议、域名、端口均相同才叫同源
- HTTP请求一般对于同源是可行的,而对于跨域则不可行(更多是要看服务器的配置)
-
Content Security Policy(CSP)
- 哪些源被认为是安全的
- 来自安全源的脚本的脚本可以执行,否则直接抛错
- 对eval或内联script直接报错
CSRF的防御
- 如果伪造请求是异常来源,限制请求
-
token防御机制:
- 浏览器向服务器请求页面
- 服务器返回页面+token
- 浏览器请求API时携带token
- 服务器验证token并返回数据
-
iframe攻击——同源请求
- X-Frame-Options:DENY/SAMEORIGIN
-
GET请求不应该既可以请求数据又可以修改数据
-
SameSite Cookie
- 避免用户信息被携带
- 第三方cookie不会被携带
Injection的防御
- 找到项目中查询SQL的地方
- 使用prepared statement
防御DoS
- 完善代码,避免贪婪模式的正则表达式
- 拒绝用户提供的使用正则
防御DDoS
-
流量治理
- 负载均衡
- API网关
- CDN
-
快速自动扩容
-
非核心服务降级
防御中间人
-
HTTPS
- 可靠性
- 完整性
- 不可依赖性