Skip to content

NextSkin 0.2.0

Choose a tag to compare

@github-actions github-actions released this 22 Oct 16:51
· 123 commits to main since this release

站内通知、后台的失败任务页,全站加上了内容安全策略(CSP)。部署步骤见部署文档。

运行环境

Node ≥ 24,推荐 Node 26;Next 16.4.2。
镜像:ghcr.io/glasden/nextskin:0.2.0(linux/amd64、linux/arm64)。

安全修复

  • 登录、注册等页面的脚本还没加载完时就点提交,浏览器会把表单的内容(包括密码)拼进本站页面的地址里提交,密码会留在地址栏、浏览器历史和反向代理的访问日志里。网速慢、脚本加载慢时才会碰上。现在表单一律按 POST 提交,脚本没加载完时只是把页面重新打开一次。建议检查反向代理的访问日志里有没有带 password= 的请求,有的话删掉这些日志。
  • 全站页面加上内容安全策略:页面只执行带本次请求 nonce 的脚本,即使哪里漏了转义,注入进页面的脚本也不会运行(ADR-0053)。

迁移

有:0046_create_notifications,新建站内通知的三张表,不改已有的表。

升级之前先备份。SQLite 在迁移前会自动备份到 data/backups/;MySQL、PostgreSQL 要自己备份。升级以后不能直接换回 0.1.x:回退要先恢复升级前备份的数据库,步骤见升级和回退。

不兼容的部署变化

  • 站点不能再嵌进别的网站的 iframe:全站发 X-Frame-Options: DENY 和 frame-ancestors 'none',原来只有授权页这样做。
  • 会改写页面脚本的 CDN 功能要关掉:比如 Cloudflare 的 Rocket Loader、邮箱地址混淆,它们插入或改写的脚本不带 nonce,会被浏览器拦下。Cloudflare 的 Bot Fight Mode 可以照常开。反向代理和 CDN 也不要去掉页面的 Content-Security-Policy 头,或者另加一条 CSP。详见部署文档的CDN 和内容安全策略。

环境变量、Node 下限、启动方式都没有变。

变化

  • 站内通知(ADR-0052)
    • 页头的铃铛显示未读数,点开是最近 5 条未读通知;用户中心有"通知"页,可以标为已读、删除、全部标为已读。
    • 举报有了结果、有人提交新举报、管理员下架或删除了材质、管理员修改了账号、角色或 OAuth 应用,都会发站内通知;没配邮件的站点也有。
    • 后台新增"通知"页,管理员可以给全部用户、普通用户、管理员或指定用户发通知,群发可以撤回。新权限 notifications.send 给管理员和超级管理员。通知默认保留 365 天,在设置里改。
    • 插件 API 随 @nextskin/plugin-sdk 升到 1.0.0-rc.4,新增能力 notifications.send。用到这个能力的插件只能装在 0.2.0 及以后的版本上。
  • 后台的失败任务页(ADR-0051):发送失败的邮件这类重试多次仍然失败的后台任务,超级管理员可以在 /admin/failed-jobs 查看原因、重试或删除。邮件失败时显示 SMTP 的错误类别。后台概览会提示有多少失败的任务。
  • 内容安全策略(ADR-0053):见上面的"安全修复"和"不兼容的部署变化"。
  • 插件的 Markdown 页面里,代码块右上角有复制按钮。
  • 修复:窄屏上,页头会盖住从它打开的菜单和弹出层。

已知的限制

  • 全站 CSP 还没在真实网络上核对:三家验证码(Turnstile、hCaptcha、reCAPTCHA)和 Cloudflare 的 Web Analytics 自动注入在这条策略下是否正常。用验证码的站点升级后请试一次登录,遇到问题请反馈。
  • 部署文档里标了"未实测"的条目(宝塔和 1Panel 的反向代理、Windows 上的 Ctrl+C 和做成服务、Docker 里导入)还没在真实环境里核对过。
  • 四个第三方登录插件返回的账号标识和邮箱验证状态,还没用真实账号逐家核对。