安全设计
Scion 模块以安全优先原则构建。每个模块都实现这些不可妥协的安全要求。
核心原则
1. 永远不信任客户端输入
所有用户输入在处理前都会被验证、清理和长度限制。
2. 纵深防御
多层保护:输入验证、限流、输出转义。
3. 安全失败
错误返回通用消息。不向客户端泄露内部细节。
安全特性
输入验证
- CRLF 注入防护 — 在所有用户输入(头部、URL、名称)中拒绝
\r\n - 空字节拒绝 — 在所有字符串输入中拒绝
\x00 - 长度限制 — 所有用户提供的字符串都有最大长度检查(128-1024字符,根据上下文)
内存保护
- 内存耗尽防护 — 无界增长的 map/slice 必须有
maxBuckets或maxEntries限制 + LRU 淘汰 - 限流 — 固定窗口、滑动窗口和令牌桶算法
路径安全
- 路径遍历防护 — 使用
filepath.Base()+ 在所有文件操作中拒绝.. - 不信任 X-Forwarded-For —
ClientIP()仅返回r.RemoteAddr;XFF 是客户端可控的,可伪造
SQL 安全
- 参数化查询 — 永远不拼接用户输入到 SQL
HTTP 安全
- Panic 恢复 — 所有 HTTP handler 必须从 panic 中恢复
- 请求体大小限制 — 防止大载荷攻击
- 超时 — 防止 slowloris 攻击
模块特定安全
| 模块 | 安全特性 |
|---|---|
| Auth | 限流,用户枚举防护,JTI,aud/iss 验证 |
| CRUD | 排序/过滤白名单,SQL注入防护,分页上限 |
| Middleware | CRLF 注入防护,可信代理,请求体大小限制 |
| RBAC | 通配符权限,循环检测,层级继承 |
| Rate Limit | 内存耗尽防护,LRU 淘汰,键长度限制 |
| Validation | 正则DoS防护 (RE2),空字节/CRLF 拒绝,panic 恢复 |
| File Upload | 魔数校验,路径遍历防护,大小限制 |
| Health | SSRF 防护(私有IP拒绝),CRLF 注入防护 |
| Cache | 后台清理,goroutine 泄漏防护,最大条目限制 |
| Pagination | 游标 Base64 校验,负偏移钳制,最大限制强制 |
| 头部注入防护,XSS 转义,附件清理 |
安全清单
适配任何模块时,确保:
- [ ] 所有用户输入在处理前都经过验证
- [ ] 所有字符串都强制长度限制
- [ ] 敏感端点配置了限流
- [ ] SQL 查询使用参数化语句
- [ ] 文件路径使用
filepath.Base()清理 - [ ] 错误消息不泄露内部细节
- [ ] HTTP handler 从 panic 中恢复
测试安全性
每个模块包含 pentest_test.go,包含攻击场景测试用例:
bash
cd registry/<module>/src/go
go test -v -run Pentest ./...测试覆盖包括:
- CRLF 注入尝试
- 空字节注入
- 路径遍历尝试
- SQL 注入尝试
- 内存耗尽尝试
- 限流绕过尝试