帝国 CMS 留言板封禁 IP 代码片段|拦截垃圾留言、恶意刷屏完整方案
帝国 CMS 留言板封禁 IP 代码片段|拦截垃圾留言、恶意刷屏完整方案
很多使用帝国 CMS 搭建资讯、资源站的站长都会遇到同一个难题:留言板长期被爬虫、广告机批量发布垃圾外链、色情广告,手动删除留言效率极低,频繁开启验证码又会影响正常用户体验。
最有效的根治方案是IP 封禁拦截,在留言提交前直接拉黑恶意 IP,阻止垃圾数据入库。本文分享三套实测可用的拦截方案,从简易静态黑名单到可后台管理的数据库黑名单,全部适配帝国 CMS7.5/8.0 全版本,兼容 CDN、反向代理真实 IP 获取。
一、前置知识点:帝国 CMS 留言板提交文件路径
前台留言提交核心文件:e/tool/gbook.php 所有留言新增逻辑、IP 拦截代码均在此文件内修改,找到提交判断代码 if($enews=="AddGbook"),在该代码上方插入拦截代码即可生效。
方案一:简易静态 IP 黑名单(新手快速部署)
适合 IP 封禁数量少、不需要后台管理的站点,直接在代码内写入黑名单 IP,无需新建数据表,部署仅需 10 秒。
完整拦截代码
<?php
// 帝国CMS留言板IP封禁拦截模块
// 可填写单个IP、IP段(末尾带.代表封禁整个网段)
$ban_ip_list = [
'111.22.33.',
'120.89.56.123',
'223.112.67.'
];
// 获取访客真实IP(兼容CDN、反向代理、负载均衡)
function get_real_ip(){
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ip_arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$ip = trim($ip_arr[0]);
}elseif(isset($_SERVER['HTTP_CLIENT_IP'])){
$ip = trim($_SERVER['HTTP_CLIENT_IP']);
}else{
$ip = trim($_SERVER['REMOTE_ADDR']);
}
return $ip;
}
$visitor_ip = get_real_ip();
$is_ban = false;
// 循环匹配黑名单IP/IP段
foreach($ban_ip_list as $ban_ip){
if(strpos($visitor_ip, $ban_ip) === 0){
$is_ban = true;
break;
}
}
// 检测到封禁IP,直接拦截退出
if($is_ban){
echo "<script>alert('您的IP已被禁止发布留言,如有疑问请联系站长!');history.back();</script>";
exit;
}
?>
使用说明
$ban_ip_list数组自定义封禁 IP:- 完整 IP:
120.89.56.123仅封禁单一地址 - IP 段:
111.22.33.封禁111.22.33.1 ~ 111.22.33.255全部网段
- 完整 IP:
- 代码插入位置:
e/tool/gbook.php,if($enews=="AddGbook"){上方 - 优势:无需操作数据库,零成本部署;缺点:修改黑名单需要改代码文件
方案二:数据库持久化黑名单(商用站点推荐)
适合长期运营、垃圾留言量大的站点,IP 黑名单存入数据库,支持后台一键拉黑垃圾留言 IP,永久留存封禁记录,可拓展解封、批量管理功能。
步骤 1:新建 IP 黑名单数据表
后台进入【系统 - 数据库管理】,执行以下 SQL 创建黑名单表:
CREATE TABLE `{$dbtbpre}enews_banip` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
`ip` varchar(50) NOT NULL COMMENT '封禁IP/IP段',
`addtime` int(11) NOT NULL COMMENT '封禁时间戳',
`note` varchar(200) DEFAULT '' COMMENT '封禁备注',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_ip` (`ip`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='留言板IP黑名单';
步骤 2:留言提交页读取黑名单拦截
同样在 gbook.php 提交逻辑顶部插入拦截代码:
<?php
// 获取真实访客IP
function get_real_ip(){
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ip_arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$ip = trim($ip_arr[0]);
}elseif(isset($_SERVER['HTTP_CLIENT_IP'])){
$ip = trim($_SERVER['HTTP_CLIENT_IP']);
}else{
$ip = trim($_SERVER['REMOTE_ADDR']);
}
return $ip;
}
$visitor_ip = get_real_ip();
$is_ban = false;
// 查询所有封禁IP
$ban_query = $empire->query("SELECT ip FROM {$dbtbpre}enews_banip");
while($ban_row = $empire->fetch($ban_query)){
if(strpos($visitor_ip, $ban_row['ip']) === 0){
$is_ban = true;
break;
}
}
if($is_ban){
echo "<script>alert('该IP已被永久封禁,禁止发布留言!');location.href='../index.php';</script>";
exit;
}
?>
步骤 3:后台留言列表增加【一键封禁 IP】按钮
文件路径:e/admin/tool/gbook.php
- 找到留言循环输出
<?php while($r=$empire->fetch($query)){ ?>内部,在操作栏添加封禁按钮:
<a href="?enews=banip&ip=<?=$r['ip']?><?=$ecms_hashur['ehref']?>" onclick="return confirm('确认永久封禁该IP?')" style="color:#f00;">封禁IP</a>
- 在文件最顶部 PHP 逻辑区域,增加封禁处理代码:
<?php
if($enews == 'banip'){
$ban_ip = RepPostVar($_GET['ip']);
// 重复IP自动更新封禁时间,不重复新增
$empire->query("INSERT INTO {$dbtbpre}enews_banip(ip,addtime,note) VALUES('$ban_ip','".time()."','垃圾留言自动封禁') ON DUPLICATE KEY UPDATE addtime='".time()."'");
echo "<script>alert('IP封禁成功!');history.back();</script>";
exit;
}
?>
方案优势
- 后台打开留言列表,看到垃圾留言可一键拉黑对应 IP
- 黑名单持久化存储,更换模板、覆盖文件不会丢失封禁记录
- 可自行拓展黑名单管理页面,实现 IP 解封、批量删除、批量导入功能
方案三:全站统一 IP 拦截(留言 / 评论 / 投稿全部生效)
如果需要全站统一拦截黑名单,不仅限制留言板,同时拦截评论、会员投稿、反馈表单等所有提交接口,将拦截代码放入全局连接文件: 文件路径:e/class/connect.php 在文件最顶部 <?php 后插入方案二的数据库黑名单拦截代码,全站所有页面加载时自动校验 IP,恶意 IP 无法执行任何提交操作,防护范围最大化。
四、拓展优化实用技巧
- CDN 兼容保障
get_real_ip()函数兼容阿里云 CDN、腾讯云、Cloudflare、Nginx 反向代理,优先读取真实访客 IP,不会误封服务器节点 IP。 - 拦截日志拓展 可新增访问日志表,记录封禁 IP 的访问时间、页面、UA,用于溯源攻击源:
CREATE TABLE `{$dbtbpre}enews_banip_log` (
id INT AUTO_INCREMENT PRIMARY KEY,
ip VARCHAR(50),
addtime INT,
url VARCHAR(255),
ua TEXT
) ENGINE=InnoDB CHARSET=utf8mb4;
- 区分访客与管理员 增加判断,后台管理员 IP 不受黑名单限制,避免运营人员误封自身 IP:
// 后台登录用户跳过IP校验
if($logininid>0){
$is_ban = false;
}
- 自定义跳转页面 不使用弹窗提示,可直接跳转到自定义 403 禁止访问页面,提升网站美观度:
header("Location: /403.html");
exit;
五、常见问题解答
Q1:添加代码后垃圾留言依旧能提交?
A:检查代码插入位置,必须放在 if($enews=="AddGbook") 代码块上方,拦截逻辑要在数据入库前执行。
Q2:CDN 站点识别到的 IP 是服务器 IP,不是访客 IP?
A:需要在 CDN/nginx 配置中开启真实 IP 转发,同时保留文中 get_real_ip() 完整代码。
Q3:封禁 IP 段后部分正常用户无法留言?
A:尽量精确封禁完整 IP,仅批量广告爬虫时使用 IP 段封禁,避免大范围网段拦截正常访客。
总结
三套 IP 封禁方案覆盖不同规模站点需求:小型个人站选用静态黑名单快速部署;商业运营站点推荐数据库黑名单,搭配后台一键拉黑功能;高防护需求站点使用全站全局拦截。所有代码原生适配帝国 CMS 架构,无第三方依赖,复制即可直接使用,从源头拦截垃圾留言,大幅降低后台维护工作量。
本文配套模板、静态源码可前往艾立兹素材库alisucai.com下载