🐛 Bug 1:分页接口 /api/topics 非法拦截 page=1 ,报错 400 (严重级/接口逻辑缺陷)
* 严重程度:普通/严重(核心分页接口缺陷)
* 问题描述:无论是首页还是各个分类,尝试请求第 1 页的公开数据接口时,后端一律返回 400 报错并提示参数错误,只有传 page=2 及以上才放行。
* 复现步骤:
直接在浏览器或终端请求:
curl -i "
https://bbs.ss/api/topics?tab=latest&page=1"
(任何 tab 只要 page=1 都一样)
* 实际结果:返回 HTTP 400 Bad Request ,内容:{"message":"请检查输入参数"}
* 预期结果:正常返回第 1 页的帖子列表 JSON 数据。
* 根因定位:后端 Zod 校验规则中对 page 参数误设置了 .min(2) 或 .gt(1)(开发时可能误以为第 1 页永远走 SSR ,客户端只负责拉第 2 页及以后),导致任何合法的 page=1 请求被系统当作非法参数拦截。
---
🐛 Bug 2:数据少于一页或超出末页时,后端重复返回第一页数据且 page 字段返回 1 (严重级/数据逻辑与潜在死循环)
* 严重程度:严重 Bug (数据错误 + 状态混乱)
* 问题描述:当请求页码超出实际总页数(例如在总共只有 2 篇帖子的 solved 分类下请求第 2 页或第 3 页),后端不仅没有返回空列表,反而每次都把第 1 页的数据重新打包返回一遍,而且 response 里的 page 字段依然强行写死返回 1 。
* 复现步骤:
1. 当前 solved (已解决)分类下总共只有 2 条帖子,总页数 pages: 1 。
2. 请求第 2 页:curl -s "
https://bbs.ss/api/topics?tab=solved&page=2"
3. 请求第 3 页:curl -s "
https://bbs.ss/api/topics?tab=solved&page=3"
* 实际结果:
两个请求均返回 200 ,但返回的数据全部是:
{"topics": [第 1 页的两条数据], "total": 2, "page": 1, "pages": 1}
* 联动隐患:前端 InfiniteTopicList 组件在获取到数据后会执行 setPage(res.page),由于后端每次都把 page 倒带回 1 ,极易导致前端触底加载陷入无休止请求第 2 页的死循环。
---
🐛 Bug 3:作品详情页「保存图片」分享海报功能彻底失效(严重级/功能报错不可用)
* 严重程度:严重 Bug (核心活动功能页面崩溃/失效)
* 问题描述:在作品冲榜和作品详情页面中,用户点击「分享」并在弹出的海报卡片中点击「保存图片」,界面完全无反应,图片无法下载。
* 复现步骤:
1. 电脑/手机打开任意有封面图的作品详情,例如:
https://bbs.ss/works/w-fate-2fc52bdb 2. 点击「分享」按钮呼出分享对话框。
3. 点击对话框右下角的「保存图片」按钮。
* 实际结果:
没有文件下载,浏览器控制台报错:
SecurityError: Failed to execute 'toBlob' on 'HTMLCanvasElement': Tainted canvases may not be exported.
* 预期结果:正常生成并下载作品分享海报 PNG 。
* 根因定位:
代码位于 29cqtfdnqp3gc.js:
1. 绘制海报加载封面图 new Image() 时,未设置 img.crossOrigin = "anonymous";
2. 且 /api/media/[id] 的返回头中缺少 Access-Control-Allow-Origin: *;
3. 图片写入 Canvas 导致画布被浏览器标记为污染( Tainted ),调用 toBlob 触发安全异常,且代码中没有 try...catch ,导致按钮彻底报废。
---
🐛 Bug 4:国际化多语言下登录页面副标题错乱(普通/UI 文案错位)
* 严重程度:普通有效 Bug
* 问题描述:非中文(英文、日文、韩文、越南文)的登录页面中,登录框的主标题下方竟然显示的是「发布作品」的导语。
* 复现步骤:
打开英文版登录页:
https://bbs.ss/en/login* 实际结果:
主标题下方显示:
Show what you built and leave the real lessons behind.(展示你构建的产品,留下真正的教训)
日文版显示:作ったものを見せ、実際の学びを残しましょう。
* 预期结果:应显示登录引导语(如 Welcome back 等)。
* 根因定位:AuthForm 组件( 25mzrrfbhac54.js )的欢迎段落错误硬编码了 l("work.form.lead"),误把作品表单导语当成了登录框副标题。
---
🐛 Bug 5:国际化页面中 returnTo 丢失语言前缀,登录后直接跳回中文版(普通/体验流程缺陷)
* 严重程度:普通有效 Bug
* 问题描述:在英文/日文版页面中点击任何需要登录的操作(如私信卖家、发帖等),登录完成后页面强制跳回中文版,语言偏好丢失。
* 复现步骤:
1. 访问英文域名页面:
https://bbs.ss/en/domains/qw.do 2. 点击右侧的「 Sign in to message the seller 」按钮,观察跳转链接:
URL 为 /en/login?returnTo=%2Fdomains%
2Fqw.do 3. 登录完成后,页面跳转至 /domains/
qw.do 。
* 实际结果:英文用户登录后直接被带到了中文版页面。
* 根因定位:生成携带 returnTo 的链接时直接取了裸 pathname ,没有经过 localePath(locale, pathname) 处理,导致登录后的回跳路径剥离了 /en 前缀。
---
🐛 Bug 6:个人资料 GitHub / X 社交主页链接校验误杀常规网址(普通/表单校验缺陷)
* 严重程度:普通有效 Bug
* 问题描述:在 /settings 中填写 GitHub 或 X 主页链接时,直接从浏览器复制带 www. 的网址会被判定为非法。
* 复现步骤:
1. 打开个人设置 /settings
2. 在 GitHub 输入:
https://www.github.com/yourname 3. 在 X (Twitter) 输入:
https://www.twitter.com/yourname 4. 点击保存。
* 实际结果:表单校验报错,提示“请输入 GitHub 主页”/“请输入 X 主页”,无法保存。
* 根因定位:00b5rzonw-r3v.js 中的校验正则表达式为:
github: /^https:\/\/github\.com\//i
x: /^https:\/\/(x|twitter)\.com\//i
完全漏掉了 (?:www\.)? 的匹配,导致大量用户习惯性带 www 的 URL 被误拦截。
---
🐛 Bug 7:域名市场挂牌域名校验允许非法连字符 TLD (普通/规范校验缺陷)
* 严重程度:普通有效 Bug
* 问题描述:挂牌域名允许诸如 example.-com 或
example.com- 等带有首尾连字符的非法顶级域名通过前端校验。
* 根因定位:
域名正则:/^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9-]+)+$/
末尾的 (\.[a-z0-9-]+)+ 允许了首尾带有 - 的顶级域名,不符合 RFC 1035 与 ICANN 关于顶级域名的严格规范