fix(permissions):修复后端权限漏洞
This commit is contained in:
1 parent
9d61abda86
commit
e703c9a044
21 files changed
+233
-136
No files matched your search
@@ -892,3 +892,28 @@ s.Start()
|
||||
- **禁止用 `g.Cfg()` 读取任何注册表里的 key**:同名 key 在配置文件里恰好存在时会造成"双真相源",配置文件的值会静默覆盖管理员在后台设置的值(或反之),且 `MustGet` 对键缺失不报错,分裂长期不可见。
|
||||
|
||||
排查信号:设置页某配置"保存了但不生效";`grep -rn "g.Cfg()"` 命中的 key 同时出现在 `settings_registry.go` 中。
|
||||
|
||||
### 2026-09-03(三):ghttp 归一化尾部斜杠但不归一化中间的重复斜杠
|
||||
|
||||
**问题**:管理后台的授权(`AdminPermissionGuard`)按 `r.URL.Path` 做精确路径 / 前缀 / 前缀+后缀三段匹配。若框架对路径的归一化范围与预期不符,同一个 handler 就可能有多种匹配结果——加一个斜杠就绕到另一条(可能更弱的)规则上。
|
||||
|
||||
**框架实测行为**(GoFrame v2,`ghttp` 路由,实测端口探针验证):
|
||||
|
||||
| 请求路径 | 是否匹配到路由 | handler 里的 `r.URL.Path` |
|
||||
|----------|----------------|---------------------------|
|
||||
| `/api/admin/roles` | ✅ | `/api/admin/roles` |
|
||||
| `/api/admin/roles/` | ✅ | `/api/admin/roles`(**尾部斜杠已被去掉**) |
|
||||
| `/api/admin/roles//` | ✅ | `/api/admin/roles`(同上) |
|
||||
| `/api/admin//roles` | ✅ | `/api/admin//roles`(**中间的重复斜杠原样保留**) |
|
||||
| `/api/admin/./roles`、`/api/x/../admin/roles` | ❌ 404 | — |
|
||||
| `/api/admin/ROLES` | ❌ 404 | — |
|
||||
|
||||
即:**尾部斜杠会被归一化,路径中间的空段不会**;`.` / `..` 段与大小写变体压根匹配不到路由。
|
||||
|
||||
**正确做法(通用规则)**:
|
||||
|
||||
- **任何按 `r.URL.Path` 做字符串匹配的中间件(鉴权、限流、审计采样、灰度路由),都不能假设路径已规范化**。中间的 `//` 会带着原样路径进到 handler,字符串规则却按规范形式书写,两者对不上。
|
||||
- 处理方式选**拒收**而非**重写**:重写会把原本因规则不匹配而被拒的变体变成放行(等于放宽授权面),拒收既不放宽也不留缝隙。本项目在 `AdminPermissionGuard` 入口用 `isCanonicalPath` 直接 403,正常客户端不会产生这类路径。
|
||||
- 尾部斜杠已由框架处理,无需自行 trim,**也不要因此把 `/xxx/` 当作合法输入去写规则**——handler 永远看不到它。
|
||||
|
||||
排查信号:某接口"多加一个斜杠就能绕过权限/限流";中间件按路径匹配的规则表里出现了同一 handler 的两条规则。
|
||||
Reference in new issue
Block a user