fix(editor-api): 身份判定改为会话优先,防止配置漂移静默提权
identify() 原来「令牌优先」:令牌对得上就用 X-Editor-* 头的身份,没有头时默认 admin。 国内线路的 nginx 目前不注入令牌,但一旦配置回滚到「注入令牌」的旧版本,编辑的请求 会命中令牌分支 → 静默获得管理员权限(看到全部文章、能改别人的、能全量发布)。 改为「会话(真实的人)优先于共享令牌(服务身份)」,把边界写死在代码里而不是靠配置。 新增断言:编辑会话 + 管理员令牌头 → 仍按编辑身份。role-perm.mjs 47/47
This commit is contained in:
1 parent
d899cd793b
commit
68416366eb
2 files changed
+22
-7
No files matched your search
+15
-7
@@ -218,6 +218,20 @@ function decodeHeader(v) {
|
||||
* ② 浏览器直连本机后台:身份就在自己的 HttpOnly Cookie 会话里。
|
||||
*/
|
||||
function identify(req) {
|
||||
// ★ 顺序很重要:会话(具体某个人的登录态)优先于共享令牌(服务身份)。
|
||||
// 共享令牌分支的默认角色是 admin —— 国内线路的 nginx 目前不注入令牌,
|
||||
// 但一旦配置漂移回「nginx 注入令牌」的旧版本,令牌优先会让编辑直接拿到
|
||||
// 管理员权限(看到全部文章、能改别人的、能全量发布),而且是静默的。
|
||||
// 靠配置保证安全太脆弱,这里用「人优先于机器」把边界写死在代码里。
|
||||
const s = readSession(req);
|
||||
if (s) {
|
||||
return {
|
||||
uid: String(s.uid || ''),
|
||||
name: String(s.name || cfg.adminUser),
|
||||
role: s.role === 'editor' ? 'editor' : 'admin',
|
||||
};
|
||||
}
|
||||
// Worker 反代通道:由 Cloudflare 发出,不带浏览器 Cookie,只有令牌 + 身份头
|
||||
if (safeEqual(req.headers['x-editor-token'] || '', cfg.token)) {
|
||||
return {
|
||||
uid: String(req.headers['x-editor-uid'] || '').trim(),
|
||||
@@ -225,13 +239,7 @@ function identify(req) {
|
||||
role: String(req.headers['x-editor-role'] || '').trim() === 'editor' ? 'editor' : 'admin',
|
||||
};
|
||||
}
|
||||
const s = readSession(req);
|
||||
if (!s) return null;
|
||||
return {
|
||||
uid: String(s.uid || ''),
|
||||
name: String(s.name || cfg.adminUser),
|
||||
role: s.role === 'editor' ? 'editor' : 'admin',
|
||||
};
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in new issue
Block a user