LanternPress V2.5.0更新日志

功能新增

  • 友链申请系统:复用评论通道提交([logo] 图标三档 + 无协议自动补 https),数据独立存储并与评论表解耦(含兼容回退),带审核流;配套独立管理后台(登录态 + CSRF + IP 限流,支持增删改 / 排序 / 批量 / 迁移 / 清理 / 统计)。登录态访客在友链页只看到列表,「申请链接」表单仅对匿名访客显示。
  • 后台配置重构:设置外观重组为 7 组横向滚动 TAB(窄屏左右滑动);侧边栏支持按页面类型独立配置(配置项 30→35);文章页新增多分类面包屑与 JSON-LD;导航子菜单样式与构建器修复。
  • CDN 缓存自动刷新(EdgeOne):主题内置钩子(零插件)+ 前台兜底,内容更新后自动清除缓存(整站 / 仅动态页),匿名长 TTL 与内容即时可见兼得;TC3 签名零外部依赖,失败静默并留日志;后台「缓存设置」TAB 支持一键手动刷新与「最近清除记录」。
  • HSTS 下发开关:新增 ltHstsEnable(默认停用),并配「检测 HSTS 来源」按钮,按「边缘层(走 CDN)」与「源站层(CURLOPT_RESOLVE 直连 127.0.0.1)」两次探测结果,决定是否由主题补位。
  • 封面图升级:默认封面 / 无图兜底由 blog_bg.jpg 换为 default-cover 双格式——缩略图 avif 优先(image-set 回退 webp),og:image 用 webp 兼容社交爬虫,海报「无封面」判断同步更新并兼容旧缓存。

安全加固

  • SSRF:poster-proxy 全链路防护——Host 投毒 / IPv6 / DNS 重绑定 / TOCTOU 钉 IP / 限流。
  • XSS:评论协议 + 属性白名单;清理属性前缀与实体编码绕过;配置下发去除内联脚本;友链管理页 CSRF + IP 限流 + 防点击劫持,CSRF 令牌输出转义;首图背景注入面剥离反斜杠。
  • 鉴权与密钥:清除记录 / 立即刷新 / HSTS 探测三个后台接口统一要求管理员身份(前台匿名一律拒绝);EdgeOne 密钥经 themeConfigHandle 存隐藏键、拒绝客户端提交、后台不回显明文、留空不修改;清除记录改 textContent 渲染。
  • 基础项:补齐 SameSite;字段缓存 null 哨兵。

性能

  • 缓存层:manifest 静态化;侧边栏四模块整段缓存;友链申请 / 解析结果与最终 HTML 片段缓存(友链页 DB 查询归零,写操作即时失效);友链 LOGO 与头像同源代理(同时规避外链与混合内容)。
  • 查询层:评论父作者映射消除 getReply N+1,评论渲染按 cid + 版本号 + 分页 缓存(提交 / 审核 / 删除即时失效);列表页缩略图免整篇渲染;上下篇缓存加 TTL;浏览 / 点赞限流按 IP 聚合。
  • 兜底刷新:EdgeOne 前台兜底由每请求全表扫描改为脏标记 + 连败暂停;申请限流改为 IP + 邮箱双维度。

缺陷修复

  • 改正文前台不更新:主题注册的 finishArticle 在 Typecho 1.3 不存在,改为 finishPublish / finishSave / finishDelete / finishMark。
  • 后台 EdgeOne 接口恒定失败:后台 functions.php 由渲染阶段才被 require,echo 只能追加到输出缓冲尾部,JSON 必然被 HTML 污染。新增 lt_edgeone_json_begin()(发头前清空所有输出缓冲),前端改 r.text() + 容错解析,不再依赖 r.json()。
  • 列表页 description 误取文章摘要:inc/meta.php 无条件读 $widget->fields->articleDesc,而列表页 $widget->cid 指向查询结果最后一行,导致首页 / 分类 / 标签 / 归档 / 搜索页的描述全变成某篇文章摘要。改为仅单页读取,列表页回落站点描述 / 归档描述,同时省掉一次 table.fields 查询。
  • 其他:Typecho 1.3 兼容(Helper::options);友链管理页远程登录态失效引导链;主题禁用 / 文件缺失时入口自动移除;归档缓存与限频原子写等杂项。