Flarum 1.8.14 发布公告 🎉
我们为 Flarum 1.x 系列发布了另一个维护版本。此版本包含对 flarum/nicknames 的一个安全修复、一批可靠的错误修复、有意义的性能改进,以及对 GDPR 扩展的一些受欢迎的变更。
⚠️ Flarum 1.x 生命周期即将结束
此版本标志着 1.x 系列的一个转折点。它很可能是最后一个常规发布版本之一。
随着 Flarum 2.0 接近其发布候选(Release Candidate,RC)阶段,我们将立即把 1.x 转变为接近生命周期结束(End-Of-Life,EOL)的状态:
❌ 没有计划为 1.x 添加新功能、改进或调整
❌ 非安全性的错误修复通常不会向后移植
⚠️ 我们会调查并尽可能处理安全漏洞 —— 但坦诚地说:老化的依赖栈(Flarum 1.x 运行在早已结束生命周期的 Laravel 8 上)意味着某些安全问题可能无法在此分支上修复
✅ 所有积极的开发、安全工作和长期支持都发生在 Flarum 2.0 上
1.x 的官方 EOL 日期尚未确定,但会提前明确告知。目前的计划是在 2.0 稳定版发布 12 个月后 正式终止 Flarum 1.x 的生命周期。在此期间,我们强烈建议所有 1.x 论坛管理员开始规划升级到 Flarum 2.0。
🚀 如果您还没有开始评估 Flarum 2.0,现在正是时候。Beta.8 —— RC 阶段前的最后一个测试版 —— 预计在大约两周内发布。
🚨 关于 Flarum 2.0 的说明 —— 扩展开发者需要采取行动
Beta.8 预计在大约两周内发布,它将是 RC 阶段前的最后一个测试版。
以下是 RC 阶段在实际中的含义:
🔶 测试版(Beta,我们目前所处的阶段) —— API 仍在变动中。我们仍然可以更改核心以适应扩展的需求。
🔷 发布候选版(Release Candidate,RC) —— API 已冻结。没有新功能,没有破坏性变更。只接受关键的错误修复。
🟢 稳定版(Stable)2.0.0 —— 没有阻塞问题的 RC 版本即成为稳定版。
对于扩展开发者来说,这是您最重要的时机。一旦我们进入 RC 阶段,为核心 API 适配您扩展需求的能力之门就会关闭。如果您正在开发 2.0 更新,并发现核心功能阻碍了您 —— 比如 API 过于死板、缺少某些东西、接口使用不便 —— 现在是告诉我们的最佳时机。请在此处开启讨论或在 GitHub 上提交问题。我们会积极倾听,并希望帮助您在 2.0 稳定版发布的同时,推出兼容的扩展。
📣 请针对 beta.7(以及即将发布的 beta.8)测试您的扩展,并告知您的发现。在 RC 之前的每份兼容性报告,都是一个永久修复问题的机会。RC 之后,就必须等待 2.1 版本了。
🌍 帮助翻译 Flarum 2.0
Flarum 2.0 带来了大量新的字符串,在稳定版发布前完成翻译是一项巨大的社区努力。如果您使用英语以外的语言,我们需要您的帮助 —— 哪怕只是审阅或翻译几个字符串也能带来改变。
Flarum 2.0 的翻译在 Weblate 上进行管理:weblate.rob006.net/projects/flarum2
您不需要是开发者 —— 只要您能读写您的语言,就可以做出贡献。每一点帮助都很重要。🙏
🔐 安全修复 —— flarum/nicknames v1.8.3 (CVE-2026-30913)
如果您使用 flarum/nicknames 扩展,强烈建议更新到 1.8.3 版本。
发现了一个中等严重性的漏洞,并通过 SBB 社区漏洞赏金计划负责任地进行了披露。当 flarum/nicknames 启用时,用户可以将他们的昵称设置为邮件客户端会解释为超链接的字符串 —— 例如纯域名(nasty.com)或 Markdown 链接语法([CLICK](https://evil.com))。该昵称会原样包含在纯文本通知邮件中,可能误导收件人访问攻击者控制的 URL。
变体 1(自动链接) —— 像 nasty.com 这样的昵称几乎会被所有邮件客户端(Gmail、Outlook、Apple Mail、Thunderbird)自动添加链接。
变体 2(Markdown) —— 像 [CLICK](https://evil.com) 这样的昵称会被那些在纯文本中自动渲染 Markdown 的邮件客户端(例如 Apple Mail、Thunderbird)渲染为可点击的链接。
此修复在 flarum/nicknames 中添加了验证,以拒绝包含可能在邮件上下文中被误解的字符的昵称,同时保留像 Jane.Smith 这样的合法昵称。
默认的基于用户名的显示名称驱动不受影响 —— 它已经将值限制在 [a-zA-Z0-9_-]+。任何允许任意字符的第三方显示名称驱动都应进行审查。
🙏 感谢 tank0 通过 Intigriti 负责任地报告此问题,并感谢 @gianniguida 和 @Davetodave178 帮助修复和验证。
⚡ 性能改进
此版本包含多项底层优化。虽然不会直接看到变化 —— 但您的服务器会感谢您。
⚡ 通知计数已缓存 —— 之前每次页面加载都会查询数据库;现在缓存 5 分钟,并在发生变化时(包括当您删除所有通知时)自动使缓存失效。
⚡ 消除了认证最后写入时间 —— 之前每次认证请求都会无条件写入数据库;现在仅当数据实际发生变化时才写入。
⚡ 调度器时间戳移至缓存 —— 之前大约每分钟写入一次数据库;现在改为存储在缓存层。
这些更改累积起来可以显著减少数据库操作 —— 尤其是在有活跃用户的站点上。
💡 正在运行 Redis? 收益会更加显著。fof/redis v1.1.6 与这些核心改进完美搭配。它将 Flarum 的论坛设置缓存在 Redis 中,采用三层链式结构 —— 每次请求的进程内缓存、然后 Redis、然后数据库 —— 因此,在单个 Redis 生存时间(TTL)内,最多从数据库读取设置一次,并且无论调用多少次 settings->get(),每个请求最多从 Redis 读取一次。在生产环境中,仅此一项就可以将设置读取产生的 Redis 出口流量减少 超过 95%。此外,fof/redis 现在可以自动检测 phpredis(原生 PHP 扩展)并在可用时自动使用它,从而启用持久连接,在同一 PHP-FPM 工作进程内的多个请求之间复用套接字 —— 显著降低大规模环境下的连接开销。如果您正在运行 Redis 并且最近没有更新 fof/redis,现在是个好时机。
🐛 错误修复
- HTTP 405 “方法不允许”页面 现在显示正确的消息(“此页面不支持该请求方法。”),而不是通用的“发生错误”回退消息。
- 受限环境中的 PHP 警告 —— 某些主机配置下可能出现的一些 PHP 提示/警告已被解决。
- Less 布尔型自定义函数 —— 修复了返回布尔值的自定义 Less 函数未被正确处理的问题。
- 扩展管理器 —— 已移除对已停止服务的 Extiverse 市场的引用。
🔒 GDPR 扩展 —— v1.8.2
此版本包含对 flarum/gdpr 扩展的一项重要安全与合规性更新:
- 一次性确认链接 —— 擦除确认令牌现在使用后即失效。以前,用户的确认邮件链接可以无限期重复使用;现在它是一个真正的一次性链接。
- 已处理请求保护 —— 重新访问已处理或手动处理的擦除请求的确认链接,现在会返回正确的错误,而不是静默重置其状态。
- 确认 IP 记录 —— 用于确认擦除请求的 IP 地址现在会被存储,以供审计之用。
- 自动 IP 清除 —— 一个新的计划命令(
gdpr:clear-confirmation-ips)会在 90 天后自动将存储的确认 IP 设为空,保持数据留存比例适当。
- 擦除模态框时间戳 —— 管理员的处理擦除模态框现在会显示请求时间、确认时间以及符合自动处理资格的时间。
📦 已发布的版本
- Flarum Core v1.8.14
- flarum/nicknames v1.8.3
- flarum/extension-manager v1.8.2
- flarum/suspend v1.8.2
- flarum/gdpr v1.8.2
🚀 如何更新
composer update
📋 完整更新日志
Core (flarum/core)
修复
- 为 HTTP 405 “方法不允许”响应显示正确的错误消息,作者 @IanM #4417
- 修复受限环境中的 PHP 警告,作者 @IanM #4336
- 修复返回错误值的 Less 布尔型自定义函数,作者 @IanM #4405
- 当所有通知被删除时,使未读通知计数缓存失效,作者 @IanM #4391
性能
- 缓存通知计数,减少数据库查询
- 消除认证最后写入时间(last-seen)的无条件数据库写入
- 将调度器时间戳移至缓存层存储
新增
- 在所有服务提供者的启动(boot)回调完成后触发
ApplicationBooted 事件,作者 @IanM #4358
Nicknames (flarum/nicknames)v1.8.3
安全
- 验证昵称以防止通知邮件中的显示名称注入(CVE-2026-30913)GHSA-3c4m-j3g4-hh25
Extension Manager (flarum/extension-manager)v1.8.2
变更
- 移除 Extiverse 市场的引用,作者 @IanM #4395
Suspend (flarum/suspend)v1.8.2
变更
GDPR (flarum/gdpr)v1.8.2
修复 / 安全
- 使擦除确认令牌一次性有效,使用后即失效
- 添加对已处理擦除请求的防护,防止状态被静默重置
- 记录擦除确认时的 IP 地址,用于审计
- 新增
gdpr:clear-confirmation-ips 命令,用于 90 天后自动清除确认 IP
新增
- 在管理员处理擦除模态框中显示时间戳:请求时间、确认时间、符合自动处理资格的时间