此次更新为1.1.0版本上线前安全审计修复,涉及文件较多
[XSS风险] 修复 model/form.func.php form_text/form_hidden/form_textarea/form_password 未对 value 转义
影响:所有调用 form_* 的 admin 表单编辑场景
[信息泄露] index.php / api/v1/bootstrap.php DEBUG 关闭(0)
[逻辑错误] route/user.php / route/my.php / api/v1/my.php 验证码 rand → random_int(密码学安全)
[边界未校验] route/user.php / route/my.php param('password') 传第 3 参 FALSE 关闭 htmlspecialchars
[SQL N+1] model/notify.func.php / forum_follow / thread_favorite / user_follow / post_like / thread 等 6 文件 24 处 intval 收敛
[CSRF防护缺失] admin/route/forum.php / route/notice.php / route/thread.php / route/forum.php / route/my.php 共 8 处补 method+CsrfService::check()
[状态不同步] model/session.func.php / model/user.func.php / admin/admin.func.php SameSite=None → Lax
[逻辑错误] api/v1/auth.php 集成 LoginSecurityService(checkIpBan/recordIpAttempt/checkBan/recordAttempt)
[边界未校验] service/AttachmentService.php 新增 validateMime(finfo_file)+ 图片/视频/通用 MIME 白名单
[边界未校验] api/v1/attach.php + route/attach.php finfo 校验 + bin2hex(random_bytes(16)) 随机文件名
[逻辑错误] lib/security/CaptchaService.php 验证码 5 分钟过期 + 兼容旧格式
[边界未校验] route/search.php 关键字长度 > 50 拦截
[逻辑错误] route/post.php 5min/10post RateLimitService 窗口限流
[XSS风险] model/notify.func.php notify_format 拦截 javascript:/data:/vbscript: 协议
[变量未定义] route/post.php / admin/route/thread.php / route/my.php param(N) → param(N, 0) 触发 intval
[组件混用] model/plugin.func.php 新增 xn_hook() 兼容层(向后兼容旧插件)
[配置不同步] conf/.htaccess / .htaccess Apache 2.2/2.4 双分支兼容
[逻辑错误] xiunophp/image.func.php + xiunophp.min.php + tool/png2jpg.php imagedestroy 用 PHP_VERSION_ID < 80000 包裹
[语言包不同步] zh-cn / zh-tw / en-us 新增 post_reply_rate_limited / search_keyword_too_long
[逻辑错误] lib/OnlineUpgradeService.php 删除 backup()/rollback() 死代码,改为提醒用户手动备份
[逻辑错误] 修复 lib/OnlineUpgradeService.php backup() 方法引用已删除的 $backupBasePath 属性导致运行时报错
根因:$backupBasePath 属性已在之前会话删除,但 backup() 方法遗漏未删;admin/route/online_upgrade.php 已移除 backup 步骤,该方法为死代码
同步删除仅被 backup() 调用的 recursiveCopy() 辅助方法
必测: admin/?online_upgrade.htm(升级流程不再触发 backup 步骤)
[逻辑错误] 修复 route/notice.php L255 action 名 'delete' → 'list'(复制粘贴错误)
根因:L255 显示的是 admin_notice_list.htm 列表页,action 名误写为 'delete',导致 L378 真正的 delete 分支永不执行
影响:后台通知删除功能失效
必测: admin/?notice-list.htm(列表页可访问)+ admin/?notice-delete.htm(删除生效)
[XSS风险] 修复 view/htm/post_list.inc.htm 文本节点未转义(发现 1)
L40/L220 username、L46 group_name、L65 subject、L225 reply group_name、L234 reply_to_username 统一加 esc_html
必测: 帖子详情页回复列表用户名/用户组/标题显示
[XSS风险] 修复 view/htm/post_list.inc.htm HTML 属性未转义(发现 2)
L144/L260 data-username 未 esc_attr(对比 L170/L274 已转义)
必测: 帖子详情页点击「回复」按钮触发引用
[XSS风险] 修复 admin/view/htm/thread_list.inc.htm 后台帖子列表未转义
L42/L82 subject、L54/L94 username、L55/L95 forumname 统一加 esc_html
必测: admin/?thread-list.htm 显示帖子列表
[XSS风险] 修复 admin/view/htm/online_upgrade.htm innerHTML 注入(发现 5)
新增 escapeHtml() JS 函数,所有拼接 res.message / xhr.responseText / msg / warnings[i] / r.name / r.message 的 innerHTML 改用 escapeHtml 包裹
涉及 13 处 innerHTML 拼接点
必测: admin/?online_upgrade.htm 检查更新/前置检查/升级步骤/重装
[XSS风险] 修复 plugin/xnx_medal/view/htm/medal_detail.htm L147 img src 未转义(发现 7)
必测: 勋章详情页获奖用户列表头像显示
[XSS风险] 修复 view/htm/header.inc.htm URL/Token 字段未转义(发现 8)
L41/L50 canonical、L48 sitename、L53/L59 og_image、L67 csrf_token、L68 api_default_appid 统一加 esc_attr
必测: 前台所有页面 meta 标签查看源码
[逻辑错误] xnx_invite 邀请记录 IP 筛选由精确匹配改为 C 段匹配(/24),输入任一完整 IP 即匹配同网段所有记录
必测: admin/?plugin-setting-xnx_invite.htm&tab=logs,IP 框输入 195.3.223.181 应同时查出 .50 等同 C 段记录
回归: IP 筛选输入非法值仍返回空结果
[配置不同步] 精简多语言支持,仅保留 zh-cn / zh-tw / en-us,删除 ja-jp / ko-kr / ru-ru / th-th
删除 lang/ 下 4 个语言包目录(含 bbs.php/bbs_admin.php/bbs_common.php/bbs_install.php/bbs.js)
同步清理 9 处引用:route/lang.php supported、admin/route/setting.php form_select、view/htm/header_nav.inc.htm、admin/view/htm/header_nav.inc.htm、index.inc.php lang_map、lib/EditorService.php mapLangCode、xiunophp/misc.func.php browser_lang、install/index.php 3 处、tools/lang_sync_check.php locales
清理保留语言包(en-us/zh-cn/zh-tw)中 lang_ru_ru/lang_th_th/lang_ko_kr/lang_ja_jp 4 个死键
清理 tmp 编译缓存:view_htm_header_nav.inc.htm、admin_view_htm_header_nav.inc.htm、index.inc.php、lang_zh-cn_bbs.php、lang_zh-cn_bbs_admin.php
必测: 前后台语言切换下拉只剩 3 项、admin/?setting-base.htm 语言选择、安装程序语言选择
回归: 浏览器自动语言检测、编辑器语言映射
[逻辑错误] 修复 admin/route/forum.php 编辑版块 action 分支名 'delete' → 'update'(复制粘贴错误)
根因:L201 本该是 update 分支,误标为 delete,导致 forum-update-4.htm 无匹配分支页面空白;同时假 delete 分支拦截了 L405 真 delete,删除版块功能也失效
同步删除 delete 专属的 Method Error 守卫和前置 CsrfService::check(update 需支持 GET 显示表单,POST 分支内已有 CSRF 检查)
清理排查时残留的 xn_log 调试日志
必测: admin/?forum-update-4.htm(编辑表单可打开并保存)
回归: admin/?forum-list.htm(列表页)+ 版块删除功能(forum-delete 走真 delete 分支)
[信息泄露] conf.php 明文密码环境变量化
修复: conf/conf.php 第12/28行 DB密码(XIUNO_DB_PASSWORD)、第53行 Redis密码(XIUNO_REDIS_PASSWORD)、第90行 auth_key(XIUNO_AUTH_KEY)、第126行 DeepSeek API Key(XIUNO_DEEPSEEK_KEY)、第396行 api_default_secret(XIUNO_API_DEFAULT_SECRET) 改为 getenv() 读取,保留原值作为回退
删除: conf/smtp.conf.php(含明文 SMTP 密码 admin111)
必测: 首页正常加载、登录发帖、Redis缓存命中、AI编辑器调用、API接口鉴权
回归: 后台设置页保存、邮件发送功能
[边界未校验] 修复 API 层注册/更新用户输入未校验(5 高危 + 1 中危)
api/v1/auth.php register: email 加 is_email、username 加 is_username、password param 第3参 FALSE 关闭 htmlspecialchars
api/v1/user.php 管理员更新: username 非空时 is_username、email 非空时 is_email、password param 第3参 FALSE
复用 model/check.func.php 的 is_email/is_username(含长度+格式校验),与 route/user.php:548,552 及 api/v1/admin.php:430,433 现有模式一致
校验失败: auth.php 并入 $errors 数组走 validationError;user.php 单字段失败直接 validationError(422)
必测: POST /api/v1/auth/register(非法邮箱/非法用户名/含 <> 的密码)
回归: PUT /api/v1/user/{uid} 管理员更新用户信息
[新功能] 新增 xnx_icon 图标生成器插件(可视化合成 Tabler Icons 图标,导出 SVG/PNG)
必测: 后台插件管理页安装启用 xnx_icon → admin/?plugin-setting-xnx_icon.htm
功能: 图标搜索筛选/背景(纯色·渐变·无)/形状(圆·圆角·方)/圆角滑块/四角角标/尺寸预设/实时预览/4内置预设+自定义CRUD/复制·下载SVG·下载PNG
数据: icons.json 含 5093 图标元数据+path(1.7MB,页面级懒加载)
修正: setting.htm 误用 CsrfService::token() → getToken()(方法名不存在导致白屏)[逻辑错误]



