XIUNOX 1.1.9更新预告 [复制链接]

管理员组

v1.1.9 更新日志 - 2026-08-29

版本说明: 用户导航可后台自定义 + robots.txt 动态化 + Tabler Icons 异步加载瘦身 + 全文索引 MariaDB 兼容 —— 新增用户导航后台自定义编辑(新增/删除/排序,conf 落库默认 4 项),robots.txt 改动态生成修复 Google Sitemap 校验报错,Tabler Icons 移除 filled 变体并改异步加载,搜索全文索引 ngram 失败自动回退普通 FULLTEXT 兼容 MariaDB,JSON-LD 结构化数据增强,插件卡片栅格响应式优化,用户统计口径前后台统一

⚠️ Breaking Changes

  • robots.txt 动态化:静态文件 robots.txt 删除,改为 route/robots.php 由 index.php 早期拦截动态生成(Sitemap 行为完整 URL)。升级时需手动删除根目录旧 robots.txt,否则会被动态路由覆盖前的静态文件影响(见删除清单)

  • Tabler Icons 移除 filled 变体:删除 tabler-icons-filled.min.css 与 tabler-icons-filled.woff2,仅保留标准版。依赖 ti-* filled 图标的页面需改用标准版图标类

  • 升级需删除的旧文件:robots.txt、view/vendor/tabler-icons/fonts/tabler-icons-filled.woff2、view/vendor/tabler-icons/tabler-icons-filled.min.css

🆕 新功能

用户导航后台自定义(全新)

  • 后台自定义编辑 admin/route/setting.php + admin/view/htm/setting_nav.htm:首页右侧栏用户信息卡片下方两列宫格导航支持后台新增/删除/排序,配置落库 user_nav_items

  • 默认 4 项 conf/conf.default.php:资料(ti-user)、积分(ti-coins)、主题(ti-message)、关注(ti-heart),各带 icon/name_lang/slug/url/rank 字段

  • 服务层 lib/UserNavService.php(新增):用户导航项统一加载、排序与渲染逻辑

  • 前台渲染 view/htm/footer_nav.inc.htm + view/htm/sidebar_right.inc.htm:宫格导航接入新服务,侧边栏同步重构

robots.txt 动态化(全新)

  • 动态生成 route/robots.php(新增)+ index.php 早期拦截:/robots.txt 请求实时生成,Sitemap 行强制输出完整 URL(含协议+域名),修复 Google Search Console 报 "Invalid sitemap URL"

  • SEO 检测同步 admin/route/setting.php:robots 健康检查改查 route/robots.php 存在性(不再校验根目录静态文件恒不存在的场景)

  • 钩子支持:保留 robots_start/robots_body hook,插件可扩展内容

Tabler Icons 异步加载

  • 异步加载 view/htm/header.inc.htm + install/view/htm/header.inc.htm + admin/view/htm/header.inc.htm:media="print" onload="this.media='all'" 技巧移出关键渲染路径,noscript 兜底保证无 JS 场景可用

  • 瘦身:删除 filled 变体 css+字体,标准版 woff2 同步更新,体积显著下降

JSON-LD 结构化数据增强

  • 用户页 route/user.php:新增 Person mainEntity(name/url),利于个人主页搜索增强

  • 主题页 route/thread.php:DiscussionForumPosting 补充 text 字段(与 description 一致),满足富媒体摘要提取

🔧 重构与优化

用户统计口径统一

  • 前后台一致 model/runtime.func.php:首页统计用户数改传 cond(uid > 0) 触发 COUNT(*) 精确统计,避免 InnoDB 空 cond 走 information_schema 估算值导致前后台数字不一致

插件卡片栅格响应式优化

  • 本地插件列表 admin/view/htm/plugin_list.htm:栅格 col-lg-4 col-xl-3 → col-xl-4 col-xxl-3,中屏(≥1200px)每行 3 张更舒展,卡片加 overflow-hidden 防内容溢出

  • 官方插件列表 admin/view/htm/plugin_official_list.htm:栅格同步优化

搜索全文索引 MariaDB 兼容

  • 升级流程 lib/UpgradeService.php:search_indexes 步骤 ngram 创建失败自动回退普通 FULLTEXT(MariaDB 10.0.5+ InnoDB 内建 CJK bigram 分词),不再 fail-fast 阻断后续升级步骤(digest 字段/缓存配置/重编译等)

  • 全新安装 install/install.sql:FULLTEXT 索引加 TOLERANT 容错双语句(MySQL ngram / MariaDB 普通),两种数据库均可完成中文全文索引

  • 行为一致:与 route/search.php search_ensure_fulltext() 运行时回退逻辑对齐

其他优化

  • 升级探测 lib/DiscoverService.php:探测逻辑调整

  • 前端 view/js/bbs.js + view/css/bootstrap-bbs.css + view/css/theme.css:配合侧边栏/导航重构

  • 语言包:zh-cn/zh-tw/en-us 的 bbs_admin/bbs_common 同步新增导航相关文案

🐛 问题修复

  • 前台 header 破损 HTML view/htm/header.inc.htm:修复 link 与 noscript 标签意外合并导致的 href 无效 + noscript 兜底失效问题,异步加载结构恢复为两个独立元素

  • 用户创建撞唯一约束 model/user.func.php:user_create() 漏传 nickname 时第二个空串撞 UNIQUE 索引报 Duplicate entry '',现自动回退 username 兜底

  • 升级中断阻断 lib/UpgradeService.php:MariaDB 环境 search_indexes 步骤 ngram 报错导致整个升级流程中断,已修复为回退创建

📚 文档

  • xiunox-plugin-dev 文档重编:新增 references/manual/ 目录(01 架构 ~ 19 用户导航 + README + plans + plugin-mutex-guide 共 22 篇),references 下 10 篇更新,SKILL.md 刷新

  • 用户导航开发文档 docs/plugindev/19-user-nav.md

🗑️ 移除

  • robots.txt — 静态 robots 文件(改为 route/robots.php 动态生成)

  • view/vendor/tabler-icons/fonts/tabler-icons-filled.woff2 — filled 图标字体

  • view/vendor/tabler-icons/tabler-icons-filled.min.css — filled 图标样式

📊 统计

  • 文件:77(新增 ~27,修改 ~45,删除 ~5),代码 +11,325 / -4,718

  • 提交范围:c0c7451 → a6aaaf1(5 个实质提交:623bc73、7b26343、93d5127、a38f229、a6aaaf1)

  • 版本号:1.1.8 → 1.1.9

最新回复
  • xiunox 一级用户组

    感谢分享!这次 1.1.9 更新有几个亮点:robots.txt 动态化改为路由拦截,避免静态文件干扰 Sitemap 输出,思路清晰;全文索引 ngram 失败自动回退普通 FULLTEXT,兼顾 MySQL/MariaDB,兼容性处理很实用;Tabler Icons 异步加载也能有效减少首屏阻塞。

    提醒一点:升级删除旧 robots.txt 后,建议检查服务器层是否有缓存或重写规则残留旧文件,避免动态路由被提前拦截。用户导航自定义做成服务层,后续可考虑通过 hook 让插件扩展更多导航项,增强灵活性。

    整体改动扎实,期待正式版。【 AI 自动回复,仅供参考】

    1月前
  • 一粒尘埃 站长社区元老2级用户 二级用户组
    搜索结果的页面加一个  全选删除吗
    1月前
  • 广东老刘 二级用户组
    不错,希望快点成熟。
    1月前
  • leo 社区元老开发者站长 三级用户组
    学习一下,支持更新。
    1月前
  • 刘沛桐 一级用户组
    ### 1. SQL 注入(api/v1/thread.php)
    - **352/353 行**:`thread` 列表查询从字符串拼接 `$where` + 分页改为预处理封装 `db_sql_find_prepared()` / `db_sql_find_one_prepared()`,LIKE 关键字经参数数组传入 `%kw%`,彻底消除拼接注入。
    - **152/293/305 行等**:`fields`、`ids`、`orderby`、`keyword` 全部加白名单 / `intval` / 字符类过滤(`preg_replace('/[^a-zA-Z0-9_,]/','')` 等)。

    ### 2. 危险函数与命令执行
    - **tool/reset_password.php**:裸 `$db->exec("DELETE ...")` 改为 `prepare + execute` 参数化。
    - **model/post_like.func.php**:同样改为 `db_delete()` 参数化删除。
    - **service/CreditsRuleService.php**:`GET_LOCK`/`RELEASE_LOCK` 锁键经 `preg_replace('/[^a-zA-Z0-9_]/','')` 白名单(GET_LOCK 无法参数化)。
    - **service/AttachmentService.php**:`shell_exec('which ffprobe')` 返回路径增加白名单正则 + `is_executable` 双重校验后才执行。

    ### 3. XSS
    - **lib/ErrorHandler.php**:`lang()` 输出加 `htmlspecialchars()`。
    - **route/post.php**:`user_avatar_url`/`username`/`create_date_fmt` 加 `esc_html`。
    - **route/user.php**:`$u['groupname']` 两处加 `esc_html`。
    - **route/notice.php**:`echo $count` 改 `intval`。
    - **view/js/bbs.js**:新增全局 `escapeHtml()`,两处 `msgEl.innerHTML` 错误消息转义(json.message / errMsg)。
    - **view/js/attach_manage.js**:`showToast()` 的 `message` 经 `escapeHtml()` 转义。
    - **view/js/auto-save.js**:`bar.innerHTML` 的语言字符串经转义后写入。

    ### 4. 开放重定向 / CSRF
    - **admin/admin.func.php**:登录 `return_url` 注入前增加 `^(\.\/)?\?` 站内相对路径校验,防止开放重定向。
    - **lib/CsrfService.php**:CSRF token 读取与生成后统一 `preg_replace('/[^a-f0-9]/','')` 白名单(bin2hex 产物)。

    ### 5. API 输入统一过滤(10 个 API 文件)
    `credits / forum / notify / search / post / user / admin / bootstrap / attach / thread`:`fields`→白名单、`ids`→intval 数组、`type`→字母数字下划线、`keyword`/`q`→trim+mb_substr 64、`ip`→`[^0-9a-fA-F.:\/\-*]`、`reason`→控制字符剥离+500 截断、`success`→intval。

    ## 三、中危修复明细

    - **无上限日志**:`xiunophp/misc.func.php` 的 `xn_log()` 与 `route/attach.php` 下载日志增加 >10MB 自动 `rename` 归档轮转。
    - **未过滤外部输入**:全部并入上述 API 输入过滤;`index.inc.php` 的 `keyword` 同样加白名单。
    - **循环无退出保护**:
      - `model/attach.func.php` 批量删附件 `while(true)` 加 `$max_pages = 10000` 上限;
      - `xiunophp/xn_html_safe.func.php` 去 CSS 注释 `while(1)` 加 100 次迭代上限。

    ## 四、低危 / 提示批量修复

    ### @ 错误抑制符移除(约 70 处,均有 is_file/is_dir/function_exists 守卫或 try-catch 兜底)
    `xiunophp/misc.func.php`、`cache_file.class.php`、`image.func.php`、`xn_zip_old.func.php`、`model/attach.func.php`、`plugin.func.php`、`route/ai.php`、`route/attach.php`、`route/my.php`、`lib/UpgradeService.php`、`CacheService.php`、`OfficialPluginService.php`、`OnlineUpgradeService.php`、`PluginScanner.php`、`RateLimitService.php`、`ErrorHandler.php`、`security/AuditService.php`、`PHPMailer/POP3.php`、`admin/route/ai.php`、`other.php`、`plugin.php`、`setting.php`、`api/v1/attach.php`、`bootstrap.php`、`user.php` 等。
    > 保留 7 处:均为网络抓取 `@file_get_contents($url,...)`(远程瞬时故障属预期,返回值随即判 false)、`PluginScanner` 的 `@preg_match`(插件正则可能非法,命中即跳过)、`AuditService` 清理 `@unlink`。

    ### 模板 target="_blank" 统一补 rel(17 个)
    `admin/view/htm/`(13 个)+ `view/htm/`(4 个)所有 `target="_blank"` 追加 `rel="noopener noreferrer"`,已验证无重复 rel。
    1月前
  • 刘沛桐 一级用户组

    看看这个修复的怎么样

    Xiunox1.1.9.zip 4.4MB
    1月前
  • hades 一级用户组
    越来越好了
    1月前
  • wuliannan 一级用户组
    真的是不错呢
    1月前

请先登录后再回复 登录