🔐 安全加固
token 校验机制重构:新增
password_ver字段,改密/注销时 +1 撤销所有旧 token,校验改用 ver 代替 md5(password_hash) 指纹,解决 bcrypt 自动升级误踢多设备用户的问题。补全所有改密入口(找回密码、API 改密、注销账号),USER_UPDATE_PROTECTED_FIELDS禁止外部重置版本号。token 失效自动清除 cookie:修复
user_token_get中 setcookie 被注释导致失效 token 每次请求都触发日志,改为失败时自动清除bbs_token。模拟登录越权修复:
admin_token不含 uid 仅含 IP+time,模拟期间残留 cookie 可被用于访问后台。LoginAsService 手动调用admin_token_clean/set清除/重签 cookie。模拟登录高危审计修复:forceEnd 不终止活跃会话(仅更新 DB 不清理 session),改为 STATUS_FORCE_ENDED 标记 + checkTimeout 真正执行 end() 恢复;end() 日志更新顺序修正为先 DB 再 session;session 过期丢失身份时自动标记 TIMEOUT;forceEnd 增加 operator_uid 记录。
维护模式验证码请求放行:captcha-generate/verify 两处白名单放行,验证码内容不敏感仅图片数据。
🐛 核心 Bug 修复
在线升级后版本号仍为旧版本:UpgradeService.targetVersion 用常量 XIUNOX_VERSION 初始化(OPcache 缓存旧字节码),改为从磁盘 version.php 直接读取。
缓存 mkdir File exists 竞态:xiunophp.min.php 和 cache_file.class.php 的 connect()/ensure_dir()/truncate() 改用 @mkdir() + is_dir() 复核,加 function_exists 守卫防 disable_functions 环境崩溃。
HTMLPurifier border-radius 不支持:将 border-radius 从 CSSDefinition::doSetupProprietary() 移至 doSetup(),使其默认可用。
发帖编辑器粘贴大段 Word 卡死:xnx_outlink MutationObserver 与 AIEditor 内置 observer 死循环。修复:outlink 跳过编辑器内 DOM,编辑器粘贴 >100KB 自动清理(mso-* 样式/Office 命名空间),891KB → 13KB(-98%)。同时
_captchaObserver跳过编辑器内变化避免性能浪费。维护模式登录页验证码无法请求:白名单放行 captcha 路由(generate + verify)。
IP 归属地查询页三个问题:①表单 GET 提交 404——JS 拦截按 url(ip) 含 ? 选分隔符构造正确 URL;②input 默认填充访客 IP 导致混淆——删除该逻辑,URL 无 ip 时显示空;③双 ? URL 不自动查询——route/ip.php 改用 preg_match 从 REQUEST_URI 提取 ip 参数。
用户组免审勾选取消不生效:PermissionService tableExists() 错误读取
$conf['db']['master']['tablepre'](键路径错误),改用db_check_table_exists()。UpgradeService 补全allow_direct_post/reply/profile三个免审字段迁移。xnx_fields Chrome 报 Pattern attribute 正则 SyntaxError:Chrome 112+ 启用 Unicode v 标志后字符类中
-必须在开头/末尾,[a-z0-9_-]→[-a-z0-9_]。xnx_ad_selfbuy 初始化默认广告位失败:CREATE TABLE KEY 子句列引用
rank未加反引号,MySQL 8+ 保留字报错导致表未建。
✨ 新增功能
xnx_carousel 左侧栏轮播插件 v1.0.0:PC 端 Bootstrap Carousel 轮播(图片+标题遮罩/指示点/悬停箭头),图片上传自动压缩宽 300px webp。
xnx_login_as 模拟登录插件 v1.0.7:超级管理员从后台用户列表一键切换目标用户前台,顶部蓝色提示条显示剩余时间,"返回管理后台"立即恢复身份,超时自动恢复。
插件列表页改进:新增插件目录标识 badge;新增一键关闭所有已启用插件功能(带数量提示和确认弹窗)。
后台搜索页排序筛选:帖子 tab 新增正序/倒序按钮(sort=asc/desc),显式切换跳过频率限制,分页携带 sort 参数。
前台 IP 归属地查询页:数据源 ip9.com.cn 免费接口,10 分钟缓存,支持 ?ip=xxx 直达查询与手动输入。
后台安全设置登录时效:用户登录时效(天,控制 Cookie 有效期)与管理员登录时效(分钟,控制后台超时)。
邮件日志按收件人搜索:SMTP 发送日志支持收件人邮箱模糊搜索,与状态筛选可叠加。
🚀 重大升级:xnx_quest 1.3.1 → 1.4.2
发现页配置:新增"发现页显示"配置组(开关/图标/名称/排序),与 xnx_checkin 对齐。
我的任务页面:新增
/my-quest.htm,4 个 Tab(进行中/待领取/已完成/已拒绝),badge 计数,复用 quest_card.inc.htm。事件细拆分:原"完善资料"拆为
profile_basic_complete/avatar_upload/email_bind三个独立事件;事件参数化(thread_create/post_create/post_like 可指定 fid,medal_grant 可指定 medal_id)。自定义任务:1-N 步串行流程,4 种动作类型(访问 URL/复制文案/上传截图/文本输入),用户分步提交证据,全部完成后提交审核。被拒绝后按
resubmit_interval间隔才能重新提交。后台任务编辑优化:目标值字段条件隐藏;步骤编辑器动态显隐字段;勋章指定 UI 加强(检测 xnx_medal 状态)。
📦 插件详细更新
xnx_appcenter (1.15.15 → 1.15.29)
自托管审核下载修复:新增
admin_review=1参数,管理员审核下载绕过 302 跳转直接下载站内包。"付费"徽章改名:"付费"→"积分兑换",避免用户误以为平台收费。
自托管约束加强:仅现金支付,必须提供测试账号/密码(test_account/test_password 字段幂等迁移),前端锁死
price_credits_type=rmbs。收款二维码演进:开发者上传 → 后台统一配置(上传总失败)→ 改为图片 URL 文本输入框(v1.15.23)。
自托管校验修复:删除
price_credits_type !== "rmbs"误报校验,改为强制赋值。价格模式重构为三选一(1.15.29):免费/积分兑换/现金付费 卡片式 UI,下载方式自动绑定(free/credits→官方市场、cash→自托管),新增
docs/price_guide.md填写指南。上架前自检声明:新增
self_check_reportTEXT 字段(幂等迁移),富文本编辑器必填,字数下限 100 字。开发者驳回功能:
rejectDeveloper()审计状态 1→2(永久拒绝),驳回原因通知开发者。开发者提醒规则放宽:≥2 天 + ≤2 个应用。
xnx_ad_selfbuy (1.3.1 → 1.3.3)
购买页时长单位动态更新(select 补 data-unit)。
图片 URL 改为 type=text 避免原生校验拦截。
修复默认广告位初始化失败(KEY 子句加反引号)。
xnx_outlink (1.0.4 → 1.0.5)
MutationObserver 跳过编辑器内 DOM 变化,避免与 AIEditor 死循环导致浏览器卡死。
🗑️ 清理与废弃
删除 browser 浏览器提示页(IE6/7/8 兼容)及相关语言键/样式/函数。
📚 文档更新
新增
docs/error-reporting.md:面向站长的排障手册,覆盖白屏/插件禁用/改不生效/CSRF 失败场景、后台日志入口、反馈流程。精简为宝塔面板文件管理器操作 + F12 调试,删除 SSH/命令行方式。



