找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 55|回复: 0

[维护日志] [2026-08-30] [权限] [管理员帖子删除保护] - 禁止非创始人删除管理员帖子功能实现

[复制链接]
  • 打卡等级:即来则安

7

威望

409

金钱

17

贡献

超级版主

积分
499
主题
9
回帖
40
注册时间
2004-3-7
最后登录
2026-9-6
发表于 2026-8-30 01:04:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
1、问题缘起

Discuz官方论坛中有站长提到自己的论坛存在超级版主或普通版主删除管理员发布的主题或回帖的情况。虽然管理员拥有最高管理权限,但超级版主在批量操作或快速删除时,可能误删管理员的帖子,造成不必要的权限混乱和内容丢失。需要在系统层面增加一道防护:只有创始人才能删除管理员的帖子,其他管理组成员(超级版主、版主等)无权操作。

探讨过程中发现的相关问题:

问题解决方案
删除回帖和删除主题走不同的代码入口在调度器 forum_topicadmin.php 中统一拦截
前台管理面板批量删帖走独立入口在 modcp_thread.php 中单独添加验证
创始人UID硬编码不够灵活改为从 config_global.php 读取 $_G['config']['admincp']['founder']


2、解决方案

(1)简要技术分析:

在论坛管理操作的两个核心入口(forum_topicadmin.php 调度器和 modcp_thread.php 前台管理面板)中,对删除操作进行前置拦截:检查被删除帖子/主题的作者是否为管理员(groupid=1 或 adminid=1),如果是且当前操作者不是创始人,则阻断操作并提示权限不足。

(2)修改文件列表:

操作文件路径
修改/source/module/forum/forum_topicadmin.php
修改/source/include/modcp/modcp_thread.php


(3)关键代码段:

文件一:forum_topicadmin.php

定位:在
  1. if(!$specialperm && (!$_G['uid'] || !$_G['forum']['ismoderator'])) {
  2. showmessage('admin_nopermission', NULL);
  3. }
复制代码
之后插入

  1. // ===== 权限验证:禁止非创始人删除管理员的帖子 =====
  2. // 仅拦截删除操作:action=delpost(删除回帖)或 action=moderate&operation=delete(删除主题)
  3. $is_delete_action = ($_GET['action'] == 'delpost') || ($_GET['action'] == 'moderate' && $_GET['operation'] == 'delete');

  4. if ($is_delete_action) {
  5.     // 从 config_global.php 读取创始人 UID
  6.     global $_G;
  7.     $founder_uid = intval($_G['config']['admincp']['founder']);
  8.     if (empty($founder_uid)) {
  9.         showmessage('创始人UID未在config_global.php中配置');
  10.     }
  11.     $current_uid = intval($_G['uid']);
  12.    
  13.     // 获取被操作的帖子/主题ID列表
  14.     $target_ids = array();
  15.     if (!empty($_GET['topiclist']) && is_array($_GET['topiclist'])) {
  16.         $target_ids = $_GET['topiclist'];
  17.     } elseif (!empty($_GET['moderate']) && is_array($_GET['moderate'])) {
  18.         $target_ids = $_GET['moderate'];
  19.     } elseif (!empty($_GET['topiclist']) && !is_array($_GET['topiclist'])) {
  20.         $target_ids = explode(',', $_GET['topiclist']);
  21.     }
  22.    
  23.     $has_admin_author = false;
  24.     if (!empty($target_ids)) {
  25.         foreach ($target_ids as $id) {
  26.             $id = intval($id);
  27.             if (!$id) continue;
  28.             // 先查主题表(适用于主题操作)
  29.             $thread_author = DB::fetch_first(
  30.                 "SELECT authorid FROM " . DB::table('forum_thread') . " WHERE tid = " . $id
  31.             );
  32.             if ($thread_author && $thread_author['authorid'] > 0) {
  33.                 $author_info = C::t('common_member')->fetch($thread_author['authorid']);
  34.                 if ($author_info && ($author_info['groupid'] == 1 || $author_info['adminid'] == 1)) {
  35.                     $has_admin_author = true;
  36.                     break;
  37.                 }
  38.             }
  39.             // 如果主题表没有,再查帖子表(回帖操作)
  40.             if (!$has_admin_author) {
  41.                 $post_author = DB::fetch_first(
  42.                     "SELECT authorid FROM " . DB::table('forum_post') . " WHERE pid = " . $id . " OR tid = " . $id . " LIMIT 1"
  43.                 );
  44.                 if ($post_author && $post_author['authorid'] > 0) {
  45.                     $author_info = C::t('common_member')->fetch($post_author['authorid']);
  46.                     if ($author_info && ($author_info['groupid'] == 1 || $author_info['adminid'] == 1)) {
  47.                         $has_admin_author = true;
  48.                         break;
  49.                     }
  50.                 }
  51.             }
  52.         }
  53.     }
  54.    
  55.     if ($has_admin_author && $current_uid != $founder_uid) {
  56.         showmessage('只有创始人才可以删除管理员的帖子');
  57.     }
  58. }
  59. // ===== 权限验证结束 =====
复制代码
已知瑕疵:在主题列表页执行快捷删除时,阻止弹窗无法点击关闭,只能刷新页面。



文件二:modcp_thread.php

定位:在 if($do == 'delete' && submitcheck('deletesubmit')) { 之后(函数体第一行)插入

  1.     // ===== 权限验证:禁止非创始人删除管理员的帖子 =====
  2.     // 从 config_global.php 读取创始人 UID
  3.     global $_G;
  4.     $founder_uid = intval($_G['config']['admincp']['founder']);
  5.     if (empty($founder_uid)) {
  6.         showmessage('创始人UID未在config_global.php中配置');
  7.     }
  8.     $current_uid = intval($_G['uid']);
  9.    
  10.     // 获取被删除的帖子ID列表
  11.     $pids = dimplode($_GET['delete']);
  12.     $has_admin_author = false;
  13.     if (!empty($pids)) {
  14.         foreach ($pids as $pid) {
  15.             $post_author = DB::fetch_first(
  16.                 "SELECT authorid FROM " . DB::table('forum_post') . " WHERE pid = " . intval($pid)
  17.             );
  18.             if ($post_author && $post_author['authorid'] > 0) {
  19.                 $author_info = C::t('common_member')->fetch($post_author['authorid']);
  20.                 if ($author_info && ($author_info['groupid'] == 1 || $author_info['adminid'] == 1)) {
  21.                     $has_admin_author = true;
  22.                     break;
  23.                 }
  24.             }
  25.         }
  26.     }
  27.    
  28.     if ($has_admin_author && $current_uid != $founder_uid) {
  29.         showmessage('只有创始人才可以删除管理员的帖子');
  30.     }
  31.     // ===== 权限验证结束 =====
复制代码


3、最终实现效果

操作入口被删除内容作者操作者结果
帖子详情页删除管理员创始人✅ 正常删除
帖子详情页删除管理员超级版主/版主❌ 权限不足提示
主题列表页快速删除管理员超级版主/版主❌ 权限不足提示(弹窗需手动关闭)
前台管理面板批量删帖管理员超级版主/版主❌ 权限不足提示
任何删除操作普通用户超级版主/版主✅ 正常删除


4、重要技术沉淀

需更新到固化摘要:

  1. 二十六、管理员帖子删除保护(2026-08-30)

  2. 功能:禁止非创始人删除管理员(groupid=1 或 adminid=1)发布的主题或回帖
  3. 涉及文件:
  4.   - source/module/forum/forum_topicadmin.php
  5.   - source/include/modcp/modcp_thread.php
  6. 创始人UID:从 config_global.php 的 $_G['config']['admincp']['founder'] 读取
  7. 判断条件:被删除内容的作者 groupid=1 或 adminid=1,且当前操作者不是创始人
复制代码


踩坑点:

踩坑正确做法
只修改子文件(topicadmin_delpost.php)删除操作有多个入口,应在调度器 forum_topicadmin.php 中统一拦截
硬编码创始人 UID从 config_global.php 读取 founder 配置


5、进一步优化可能性

  • 支持多创始人:config_global.php 中的 founder 可支持多个 UID,当前验证逻辑只匹配单个,可扩展为数组匹配
  • 管理员定义可配置:groupid=1 和 adminid=1 的判断条件可根据论坛实际配置调整
  • 白名单机制:允许指定某些超级版主也可删除管理员帖子(需在后台配置)
  • 操作日志审计:记录所有被拦截的删除尝试,便于安全审计




发现掉链,请直接回帖报告。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|点拨论坛 |网站地图

GMT+8, 2026-10-2 04:59 , Processed in 0.424593 second(s), 12 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表