Skip to content

fix(login): ?error=__proto__ 会崩掉整个登录页 + 补全 error code 映射 - #393

Merged
longsizhuo merged 2 commits into
mainfrom
fix/login-error-notice
Jul 26, 2026
Merged

fix(login): ?error=__proto__ 会崩掉整个登录页 + 补全 error code 映射#393
longsizhuo merged 2 commits into
mainfrom
fix/login-error-notice

Conversation

@longsizhuo

Copy link
Copy Markdown
Member

involutionhell-backend#54 里属于前端的 3 条(后端 9 条见 involutionhell-backend#55)。请 review,我不合并。

🔴 这条是线上活跃缺陷

LoginErrorNoticemessages[error]无保护的原型链查找:

?error= messages[error]
discord_canary string ✅
__proto__ object
constructor / toString / valueOf function

messages["__proto__"] 返回 Object.prototype(不是 undefined,所以 ?? messages.generic 兜底不触发),React 抛 Objects are not valid as a React child/login 没有 error.tsx、全站也没有 app/error.tsx → 落到 Next 全局兜底 → 整个登录页变成 "Application error",GitHub 登录也一并不可用。

发一条链接就能让人登不了录,当前生产可复现。

改为显式 code→i18n key 白名单 + Object.hasOwn,未知 code 一律落到通用文案,绝不透传原值。

顺带修的同区域两条

  • 补齐 4 个 error code。后端实发 discord_canary / oauth_failed / oauth_state / oauth_provider,此前后两者都塌缩成"请重试"——而 oauth_state(cookie 被拦、或在授权页停留超 300s)重试会无限复现,oauth_provider(服务端缺配置)再怎么重试都不可能好。给的建议是错的,且 support 拿不到可 grep 的区分串。
  • 去掉 messages prop:NextIntlClientProvider 已在 layout.tsx:65 包裹全站,直接 useTranslations 即可,省掉"加一个 error code 要改三个文件、漏改则静默降级"的同步负担。同时删掉按钮旁叙述当前灰度阶段的注释(CLAUDE.md §3 禁止的任务性注释,且 GA 是改另一个仓库的 env,没人会回来删它)。

验证

新增 tests/login-error-notice.test.ts(5 条,含 __proto__ / constructor / toString / valueOf / hasOwnProperty 回归,以及"解析出的 key 在 zh/en 里都存在")。

pnpm test 72 通过(67 → +5)· pnpm typecheck 干净 · pnpm lint 0 error · pnpm build 通过且 build 表 ● /[locale]/login 仍是 SSG。

github-actions Bot added 2 commits July 25, 2026 18:05
线上活跃缺陷:LoginErrorNotice 里 messages[error] 是无保护的原型链查找。
messages["__proto__"] 取到的是 Object.prototype(对象而非 undefined,所以
?? 兜底不触发),把非字符串交给 React 渲染会抛错;/login 没有 error boundary,
整个登录页被替换成 "Application error",连 GitHub 登录一起不可用。
constructor / toString / valueOf 同理(取到函数)。发条链接即可让人登不了录。

改为显式 code→i18n key 白名单 + Object.hasOwn,未知 code 一律落到通用文案。

顺带(同区域):
- 补齐 4 个 error code 的映射。后端实发 discord_canary / oauth_failed /
  oauth_state / oauth_provider,此前后两者塌缩成"请重试"——而 oauth_state
  (cookie 被拦或超 300s)重试会无限复现,oauth_provider(服务端缺配置)
  再怎么重试都不可能好,给的建议是错的。
- 去掉 messages prop:NextIntlClientProvider 已在 layout 包裹全站,直接
  useTranslations 即可,省掉"加一个 error code 要改三个文件"的同步负担。
- 删掉按钮旁叙述当前灰度阶段的注释(CLAUDE.md §3 禁止的任务性注释,且 GA 是
  改另一个仓库的 env,没人会回来删它)。

新增 tests/login-error-notice.test.ts(5 条),含 __proto__ 系列回归。
72 测试通过,typecheck / lint 干净,build 表 login 仍为 ● SSG。
Copilot AI review requested due to automatic review settings July 26, 2026 06:28

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@vercel

vercel Bot commented Jul 26, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
involutionhell-github-io Building Building Preview, Comment Jul 26, 2026 6:33am
website-preview Ready Ready Preview, Comment Jul 26, 2026 6:33am

@longsizhuo
longsizhuo merged commit fddc5a9 into main Jul 26, 2026
8 of 9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants