返回列表 發文

Discuz! 8.0 Beta 内部测试中

发布形态:面向全新安装的现代化 Beta(基于 Discuz! 7.2 主线做渐进式现代化重构) 最低运行环境:PHP 8.3(兼容 PHP 8.4 / 8.5)|数据库:PDO(pdo_mysql) + MySQL 5.7+/8.0 或 MariaDB 10.1+(InnoDB / utf8mb4 / utf8mb4_unicode_520_ci)

前言:关于 Discuz! 8.0 与这份公告

为什么取名 Discuz! 8.0?
本项目并非康盛官方发行版本,而是基于 Discuz! 7.2(2010-01-06 发行版)源码进行的现代化改造。原版 7.2 至今已十余年,底层技术栈(PHP 4.x 时代语法、已被移除的 mysql_* 扩展、MD5 密码、强依赖 UCenter 用户中心)已严重落后于现代运行环境与安全标准。我们将这套经典代码彻底现代化、并补齐大量安全与架构短板后,其改动幅度与代际跨度已远超一次常规小版本升级,因此以 Discuz! 8.0 命名,标志这是一条面向 PHP 8 与 MySQL 8 时代的全新主线。
项目基础与提升
  • 代码基线与运行环境:PHP 8.3+(兼容 8.4 / 8.5)+ MySQL 8 / MariaDB 10.1+(PDO 驱动、InnoDB、utf8mb4),最低兼容与原版相比整整跨越三个大版本;
  • 保留论坛核心(版块 / 主题 / 帖子 / 会员 / 积分 / 任务 / 道具 / 勋章),同时在安全性、性能、与现代架构三方面均有较大提升——密码存储升级为 Argon2id/Bcrypt、SQL 注入分层纵深防御、用户体系本地化、数据库驱动替换为 PDO、核心启动链路减负、头像静态直链、废弃语法全面清理等(详见下文各章节)。

⚠️ 重要提醒:项目仍在持续开发中
  • 本版本为 Beta / 持续开发阶段,后续可能仍有重大调整(包括但不限于数据结构、配置项、模块边界与接口),不保证与当前形态的长期稳定兼容;
  • 不建议在生产环境使用,仅适合本地测试、评估与贡献;
  • 若您在使用过程中遇到任何 Bug 或有改进建议,请及时联系我们修正,帮助我们把 8.0 打磨得更稳健。

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
Discuz! 8.0 Beta 是一次以安全、性能、清除历史负担为三条主线的现代化重构。它保留了论坛核心(版块 / 主题 / 帖子 / 会员 / 积分 / 任务 / 道具 / 勋章),全面升级了底层技术栈,并将原本强依赖外部用户中心(UCenter)的账号体系完整收回到论坛本地。本文聚焦三大主题:安全加固、性能与现代架构、过时技术与模块移除/替换。
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
一、安全升级

1.1 密码存储:告别 MD5,改用 password_hash()

原版 Discuz! 7.2 使用 MD5 存密码,已不符合当前安全标准。8.0 Beta 全面升级为 PHP 原生 password_hash():
  • 首选 Argon2id(内存 32 MiB / 3 轮 / 单线程),环境不支持时自动降级 Bcrypt(cost 11);
  • 调用方无需感知算法差异,两种格式 password_verify() 均可识别,登录成功时由 password_needs_rehash() 决定是否需要重算升级;
  • 强度参数一律显式传入,不依赖函数默认值,避免升级 PHP 版本时触发全站无意义重算;
  • 代码中已不存在任何 MD5 密码路径,也不保留 PBKDF2 验证回退;
  • 安全提问答案同样走 password_hash() 哈希存储;
  • 修改密码 / 邮箱时刷新会话令牌,使旧 Cookie 立即失效。

旧密码字段 cdb_members.password 仅作为登录态会话令牌(32 位随机十六进制串),真正的凭据只存在于 passhash,密码哈希永不进入客户端 Cookie。

1.2 SQL 注入:分层纵深防御(L1 / L2 / L3)

原版安全模型是「GPC 注册为全局变量 + addslashes() + 全站字符串拼接」,在多类上下文(数值 / IN() 列表 / 标识符 / SQL 片段变量)下 addslashes() 根本不起作用。8.0 Beta 不推翻既有模型(1588 处拼接调用点零回归),改为按「基础设施 → 根因 → 精准修复」三层加固:
  • L1 数据层(PDO 驱动)
    • 新增 PDO::MYSQL_ATTR_MULTI_STATEMENTS => false:彻底封死堆叠查询(; 后追加 DROP/UPDATE 无法执行);
    • PDO::ATTR_EMULATE_PREPARES => false:参数化查询走服务器端原生预处理;
    • 新增 query_prepared() / fetch_first_prepared() / result_first_prepared(),支持 ? 与 :name 占位,按类型自动选 PARAM_INT/BOOL/NULL/STR;
    • 新增 quote() / quote_identifier()(标识符白名单 + 反引号,非法即抛异常)/ quote_int_list() / safe_order() / safe_limit()。

  • L2 全局辅助:新增 dintval()、dimplode()、dimplode_quoted()、dquote()、dsql_ident()、dsql_order()、dsql_limit();
    • 修正 daddslashes() 只转义「值」、放过「键」的缺陷,数组键同样 addslashes(),消除 delete[$fieldid] 类键注入。

  • L3 输入层根因:新增 DISCUZ_SQL_GUARD_VARS 常量名单,拒绝 $conditions / $sqladd / $fidadd / $extrasql 等 SQL 片段变量从 GPC 注册,堵死「变量覆盖注入」捷径;名单刻意排除 orderby / ascdesc / inajax 等合法参数,避免误伤。

精准修复覆盖 15 个文件 25 处 IN(...) 改为整数化构造、后台 DDL(动态表 / 字段名)强制整数化或 dsql_ident() 引用、错误页默认不再回显 SQL 与 MySQL 原始错误(debug 默认 0,敏感信息仅进管理员邮件与日志)。
攻防验证(44 项攻击用例全通过):堆叠查询被拒、' OR '1'='1 与 UNION 被占位符拦截、标识符白名单生效、恶意 IN 列表整数化、数组键转义、保护名单不误伤合法参数。
1.3 用户体系本地化与凭据保护

  • 内置 UCenter(服务端 / 客户端 / 通信接口 / 跨应用同步登录)整体移除,用户注册 / 登录 / 资料 / 找回密码 / 短消息 / 好友 / 头像 / 标签全部由论坛本地表实现,不再与外部分布式令牌体系纠缠;
  • 新增本地短消息表 cdb_pms、好友关系表 cdb_friends;
  • 邮箱变更新增发往新邮箱的验证码校验(仅邮箱变化时触发)。

1.4 头像上传与端点安全

  • 服务端不信任客户端裁剪:base64 严格解码 + JPEG SOI 魔数 + getimagesizefromstring() + 尺寸 / 字节上限校验;先写临时文件再 rename,任一步失败整体回滚;
  • 上传端点自行校验 hash_equals() + 同源 Referer + 登录态,所有失败都返回固定结果(避免整页 showmessage 截断 iframe 回调);
  • 修复 Windows 上传路径被 daddslashes() 加成双反斜线导致 is_uploaded_file() 失效的问题。

1.5 其他安全收口

  • IP 封禁缓存由「拼正则」改为「缓存 [lo, hi] 区间」,封禁判定不查库、PHP 与 SQL 端都能直接比较;
  • 验证码字符集移除易混淆字符(L 等),降低机器人识别成功率;
  • 后台「文件校验 / 数据库校验」清单按全新安装结构重建,报告无误。

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
二、性能与现代架构

说明:本轮以「现代化与稳健性」为主,性能收益主要来自架构层面的间接优化,而非单点基准数字。以下均为文档已验证的实测结论。

2.1 PDO 数据库驱动

  • 用 PDO(pdo_mysql) 整体替换已废弃的 mysql_* 扩展,接口与原 db_mysql 保持一致,零回归;
  • 采用 ERRMODE_EXCEPTION + 缓冲查询,遇到 2006 / 2013 断线自动重连并重试一次,提升长连接稳定性;
  • 参数化查询走服务器端原生预处理,减少 SQL 解析歧义与拼接出错面。

2.2 核心启动链路减负

每个请求必经的 include/common.inc.php 清理了三类旧环境兼容逻辑:
  • 移除 magic_quotes 运行时转义常量与死分支(不再为每个请求做无谓的转义判断);
  • 移除手工 gmdate() + $timeoffset 时差计算与动态 Etc/GMT 时区覆盖;
  • 移除仍在前台输出的 IE6/7 专用 meta 与 UA 分支。

2.3 头像静态直链

  • 新增 avatar.php:按 ?uid=&size= 直接 302 到静态文件(带 ?v=<filemtime> 版本号缓存命中),不再加载论坛框架,降低每请求开销;
  • 默认头像改为 SVG(noavatar.svg),体积更小、缩放无损。

2.4 数据库引擎与字符集

  • 建表子句由 MyISAM TYPE= 统一改为 **InnoDB ENGINE=**(90 处);
  • 校对规则统一为 utf8mb4_unicode_520_ci(MySQL 5.7/8.0 与 MariaDB 10.1+ 全部内置,索引前缀 3072 字节),并支持安装期实际探测服务端可用规则、自动回退到 utf8mb4_unicode_ci;
  • 全站运行期 Undefined array key / variable 级 Warning 在源码层面清零(不靠 @ 屏蔽),运行更干净、错误日志不再被噪声淹没。

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
三、过时技术与模块:移除 / 替换清单

3.1 数据库驱动替换

<table>
<thead>
<tr>
<th>旧技术</th>
<th>替换方案</th>
</tr>
</thead>
<tbody><tr>
<td>mysql_* 扩展(PHP 7 起移除)</td>
<td>**PDO pdo_mysql**(include/db_pdo.class.php,接口兼容旧 db_mysql)</td>
</tr>
</tbody></table>
3.2 PHP 废弃语法 / 函数清理(基线 PHP 8.3)

<table>
<thead>
<tr>
<th>类别</th>
<th>处理</th>
</tr>
</thead>
<tbody><tr>
<td>magic_quotes</td>
<td>移除 get/set_magic_quotes_runtime(),定义 MAGIC_QUOTES_GPC=false 常量保留语义</td>
</tr>
<tr>
<td>$HTTP_*_VARS</td>
<td>移除旧式超全局回退,统一用 $_GET/$_POST/$_COOKIE/$_SERVER</td>
</tr>
<tr>
<td>each()</td>
<td>改为 array_slice + reset(7.2 废弃、8.0 移除)</td>
</tr>
<tr>
<td>花括号字符串偏移 $var{0}</td>
<td>改为 $var[0](8.0 移除花括号偏移)</td>
</tr>
<tr>
<td>短开放标签 <?</td>
<td>39 处改为 <?php</td>
</tr>
<tr>
<td>preg_replace /e</td>
<td>改为 preg_replace_callback + 闭包(7.0 移除)</td>
</tr>
<tr>
<td>${var} 字符串插值</td>
<td>改为 {$var} 形式(8.2 废弃)</td>
</tr>
<tr>
<td>implode 反序</td>
<td>改 implode(',', $arr)(PHP 8 移除 glue 在后)</td>
</tr>
<tr>
<td>HP4 风格构造函数</td>
<td>同名构造改为 __construct()(8 不再识别同名构造)</td>
</tr>
<tr>
<td>引用赋值 &new</td>
<td>改为 new(PHP 7 移除)</td>
</tr>
<tr>
<td>safe_mode / mt_srand 旧种子 / create_function 等</td>
<td>移除或交回 PHP 自动机制</td>
</tr>
</tbody></table>
3.3 移除的第三方 / 业务模块

以下模块在原版中已无现实意义或强依赖已失效的外部服务,本轮按「已移除功能」标准整体拔除,不留死链:
  • Manyou(MYOP) 应用中心、在线交易、支付接口(支付宝 / 财付通)、信用评价
  • 奇虎搜索、Google 搜索接口、云平台统计(STAT 埋点)
  • 个人空间(装扮 / 布局)、论坛动态(feed)、WAP 模块、Archiver 静态化
  • 帮助(FAQ) 模块、在线会员展示、RSS 订阅、论坛统计 stats.php
  • 后台首页官方入口 / 开发团队块、企业邮局、插件扩展中心
  • 辩论 / 活动特殊主题、分类信息(Thread sort)、内置 UCenter
  • 站点的备案号 / 商业授权链接、前台侧栏与侧边背景、全文搜索分支、水印与远程附件

论坛核心业务(版块 / 主题 / 帖 / 会员 / 积分 / 任务 / 道具 / 勋章)及主题分类(threadtypes)完整保留。腾讯 QQ 互联属于 Discuz! X 系列功能,7.2 源码中本就不存在对应实现。

3.4 用户中心本地化(替换 UCenter)

  • 移除 uc_server/、uc_client/、api/uc.php、全部 UC_* 常量、跨应用同步登录 / 积分互通;
  • 注册 / 登录 / 资料 / 找回密码 / 短消息 / 好友 / 头像 / 标签全部改由论坛本地表实现;
  • 新增 cdb_pms(本地短消息)、cdb_friends(本地好友)。

3.5 头像体系替换(移植 Discuz! X5 方案)

<table>
<thead>
<tr>
<th>维度</th>
<th>旧实现</th>
<th>8.0 Beta</th>
</tr>
</thead>
<tbody><tr>
<td>存储</td>
<td>单张 avatars/<uid>.<ext></td>
<td>data/avatar/ X5 散列目录 + big/middle/small 三档 JPEG</td>
</tr>
<tr>
<td>上传</td>
<td>旧单图逻辑</td>
<td>HTML5 Canvas 裁剪器(选图 / 拖拽 / 缩放 / 三档直出),GD 降级生成</td>
</tr>
<tr>
<td>校验</td>
<td>—</td>
<td>服务端魔数 + 尺寸 / 字节上限 + 原子落档回滚</td>
</tr>
<tr>
<td>默认头像</td>
<td>noavatar.gif</td>
<td>noavatar.svg</td>
</tr>
</tbody></table>
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
四、兼容性与运行环境

  • PHP:最低 8.3,已对 8.4 / 8.5 做静态特性审查并真机验证(无隐式 nullable 参数、动态属性、addslashes(null) 等弃用项);
  • 数据库:PDO(pdo_mysql) + MySQL 5.7+/8.0 或 MariaDB 10.1+,InnoDB / utf8mb4 / utf8mb4_unicode_520_ci;已在真机 MySQL 8.4 完整跑通安装向导(91 张表全建);
  • 全量语法校验:218+ 个 PHP 文件在 PHP 8.3 下 token_get_all(TOKEN_PARSE) 全部通过,0 错误;
  • 全站扫描:97 个关键 URL(前台 30 + 后台 67)管理员可见 Undefined array key / variable 级 Warning 0 条,除兼容跳转外全部返回 200。

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
五、安装与升级注意事项

  • 上传全部文件,授予 forumdata/、data/(含 data/attachment/、data/avatar/)、config.inc.php 可写权限;
  • 访问 install/,按向导建库(PHP 8.3+ 且加载 pdo_mysql;MySQL 5.7+/8.0 或 MariaDB 10.1+,InnoDB / utf8mb4);
  • 本 Beta 仅保证全新安装可用,不提供任何数据迁移 / 升级脚本;已有旧库需人工 ALTER DATABASE / TABLE ... CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;
  • 安装完成后建议手动删除 install/ 目录(虽新增 $keepinstallindex 开关避免自动删除失败导致后台打不开,正式上线仍应移除);
  • 首次进入前台会自动生成 forumdata/cache/ 缓存。

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
六、已知遗留与后续计划

  • 语言包中仍有少量历史遗留但无引用的键值(静态字符串,不影响加载);
  • memcp.php 中「邮箱需重新激活」提示分支依赖上游从未赋值的变量,恒不触发(为保持行为未改动);
  • ipdata/wry.dat 在原版包中即缺失(使用 tinyipdata.dat 作为 IP 库);
  • 后续渐进式迁移:本轮保留 1588 处拼接式调用点兼容性,剩余 754 处以「DB 查询结果累加的内部 ID 串」为主,已由 L1 禁用多语句 + L3 片段变量保护 + L2 整数化工具形成纵深防御;后续轮次将按静态扫描分级清单,按模块逐步迁移到 query_prepared()。新代码约定:**凡涉及外部输入的查询一律走参数化,纯整数 ID 列表用 dimplode(),动态列 / 表名必须经 dsql_ident()**。


源码下载地址:https://limewire.com/d/yUpgG#YTKgYi5Gts

后期计划更换后台管理面板,重新设计论坛页面以,使用 markdown编辑器替换 dz 的 bbcode,最新体验请看演示论坛(数据可能随时清空)。
收藏 分享

已知问题:
1. lima-city.de 的MySQL数据库版本为8.4,安装最后一步页面会变成乱码,可直接访问首页,不影响正常使用;
2. 任务系统,修改个人资料时会出现500错误,正在排查是否环境原因;
3. 管理员页面可能会出现较多 PHP 未定义变量或数组的警告提示,工具扫不出来,只能一点点排查。4. 伪静态有故障,页面404;
5. 编辑器无法使用html代码,板块设置页面提交500。

TOP

返回列表