两个角度看 Web 安全
攻击
XSS
Cross-Site Scripting(XSS):跨站脚本攻击。
攻击者通过某种方式,将自己的恶意脚本插入到网页中。
XSS 能够成功的原因:
-
开发者盲目信任用户的提交内容
-
开发者将用户输入的字符串转化为 DOM
document.writeelement.innerHTML = anyStringSSR(user_data):伪代码
XSS 的特点:
- 通常难以从 UI 上感知(暗地执行脚本)
- 窃取用户信息(cookie / token)
- 绘制 UI(例如:弹窗),诱骗用户点击 / 填写表单
分类:
-
Stored XSS(存储型的 XSS)
- 恶意脚本被存在数据库中
- 访问页面 -> 读数据 === 被攻击
- 危害最大,对全部用户可见
-
Reflected XSS(反射性 XSS)
- 不涉及数据库
- 从 URL 上攻击
- 从服务器上注入
-
DOM-based XSS(基于 DOM 的 XSS)
- 不需要服务器的参与
- 恶意攻击的发起 + 执行,全在浏览器完成
-
Mutation-based XSS(基于 DOM 渲染的 XSS)
- 利用了浏览器渲染 DOM 的特性(独特优化)
- 不同浏览器,会有区别(按浏览器进行攻击)
CSRF
Cross-site request forgery(CSRF):跨站伪造请求。
向服务器发起伪造请求。
常用:iframe
- 在用户不知情的前提下
- 利用用户权限(cookie)
- 构造指定的 HTTP 请求,窃取或修改用户敏感信息
Injection
Injection:注入请求。
向请求中注入某些数据。
例如:SQL Injection 就是向请求中注入 SQL 参数,恶意修改数据库。
分类:
-
SQL
-
CLI
-
OS command
-
Server-Side Request Forgery(SSRF):服务端伪造请求
严格来说,SSRF 不是 Injection,但是原理类似
DoS
Denial of Service(DoS):拒绝服务。
通过某种方式(构造特定请求),导致服务器资源被显著消耗,来不及响应更多请求,导致请求挤压,进而雪崩效应。
DDoS
Distributed Dos(DDoS):大量拒绝服务。
短时间内,来自大量僵尸设备的请求流量,服务器不能及时完成全部请求,导致请求堆积,进而雪崩效应,无法响应新请求。
传输层——中间人攻击
防御
XSS
- 永远不信任用户的提交内容
- 不要将用户提交内容直接转换成 DOM
现成工具
前端:
-
主流框架默认防御 XSS
例如:Vue、React
-
google-closure-library
服务端(Node):
- DOMPurify
CSP
Content Security Policy(CSP):内容安全策略。
- 允许开发者定义哪些源(域名)被认为是安全的
- 来自安全源的脚本可以执行,否则直接抛错
- 对 eval + inline script 说 no
<!-- 浏览器中设置 -->
<meta http-equiv="Content-Security-Policy" content"script-src self>
CSRF
核心:限制伪造请求。
-
请求头部
-
Origin
同源请求中,GET + HEAD 不发送
-
Referer
-
-
token
-
防御 iframe 标签
服务器端设置响应头
X-Frame-Options: DENY / SAMEORIGIN- DENY:当前页面不能被做为 iframe 进行加载
- SAMEORIGIN:同源页面才能加载 iframe
-
SameSite Cookie(避免用户信息被携带)
| SameSite | CORS |
| -------------- | ------------- |
| Cookie 发送 | 资源读写(HTTP 请求) |
| domain vs 页面域名 | 资源域名 vs 页面域名 |
| Cookie domain | 白名单 |
防御 CSRF 的正确姿势
创建中间件 middlewares,这个中间件就专门用于生成各种防御 CSRF 的策略。
SQL Injection
-
最小权限原则
- sudo || root
-
建立允许名单 + 过滤
- rm
-
对 URL 类型参数进行协议、域名、ip 等限制
- 访问内网
DoS
- 代码扫描 + 正则性能测试
DDoS
-
过滤
-
流量治理
- 负载均衡
- API 网关
-
-
抗量
-
流量治理
- CDN
-
快速自动扩容
-
非核心服务降级
-
传输层——防御中间人
- HTTPS
SRI
Subresource Integrity(SRI):子资源完整性。
防止静态资源被劫持篡改:对比 hash。