在配置拦截规则前,你需要了解常见的恶意访问类型。以下为ZBlog网站最常遇到的几种攻击形式:
攻击者在短时间内发送大量请求,消耗服务器资源。典型表现包括:
这类访问会尝试寻找网站漏洞:
自动抓取网站内容的程序:
在Nginx配置文件中添加以下规则,配置文件通常位于/etc/nginx/nginx.conf或站点配置目录:
``` 限制连接频率 limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn perip 10; 限制请求频率 limit_req_zone $binary_remote_addr zone=reqlimit:10m rate=1r/s; limit_req zone=reqlimit burst=5 nodelay; 阻止特定User-Agent if ($http_user_agent ~ (AhrefsBot|SemrushBot|MJ12bot|DotBot) ) { return 403; } 阻止扫描尝试 location ~ \.(php|asp|aspx|jsp|cgi)$ { if ($request_uri ~ "/(admin|wp-admin|phpmyadmin|administrator)") { return 403; } } ```配置完成后执行nginx -t测试配置,然后执行systemctl reload nginx重新加载配置。
在.htaccess文件中添加以下规则,该文件位于ZBlog根目录:
``` 开启重写引擎 RewriteEngine On 阻止恶意User-Agent RewriteCond %{HTTP_USER_AGENT} (AhrefsBot|SemrushBot|MJ12bot) [NC] RewriteRule . - [F] 限制请求方法 RewriteCond %{REQUEST_METHOD} ^(HEAD|TRACE|TRACK) [NC] RewriteRule . - [F] 阻止特定文件访问进入ZBlog后台,依次点击应用中心 → 插件管理 → 获取更多插件,搜索"防CC攻击"安装。安装完成后进行以下配置:
在插件设置页面,找到"基础设置"选项卡:
在"高级规则"选项卡中添加以下自定义规则:
``` 阻止特定路径扫描 /admin/ => block /wp-admin/ => block /phpmyadmin/ => block /.git/ => block 阻止可疑参数 ?cmd= => block ?exec= => block ?system= => block ?phpinfo => block ```安装"ZBLOG验证码增强版"插件,在以下位置启用验证码:

关键配置项:
编辑zb_users/c_option.php文件,在文件末尾添加:
``` // 防恶意访问设置 $GLOBALS['filter'] = array( // 屏蔽IP段 'block_ips' => array( '123.456..', '789.012.34.' ), // 允许的User-Agent 'allow_agents' => array( 'Mozilla', 'Chrome', 'Safari', 'Baiduspider', 'Googlebot' ), // 请求频率限制 'rate_limit' => array( 'max_requests' => 30, 'time_period' => 60 ) ); ```在ZBlog根目录创建security.php文件,内容如下:
``` 10) { header('HTTP/1.1 429 Too Many Requests'); exit('Too many requests'); } } else { $_SESSION['request_count'] = 1; $_SESSION['last_request'] = $current_time; } } else { $_SESSION['request_count'] = 1; $_SESSION['last_request'] = $current_time; } ?> ```然后在ZBlog的zb_users/theme/你的主题名/include.php文件开头添加:
``` require_once dirname(__FILE__) . '/../../security.php'; ```在phpMyAdmin中执行以下SQL语句:
``` CREATE TABLE IF NOT EXISTS `zbp_access_log` ( `log_id` int(11) NOT NULL AUTO_INCREMENT, `ip_address` varchar(45) NOT NULL, `user_agent` text NOT NULL, `request_url` text NOT NULL, `request_time` datetime NOT NULL, `request_count` int(11) DEFAULT '1', `is_blocked` tinyint(1) DEFAULT '0', PRIMARY KEY (`log_id`), KEY `ip_address` (`ip_address`), KEY `request_time` (`request_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ```执行以下SQL创建自动处理程序:
``` DELIMITER $$ CREATE PROCEDURE `block_malicious_ips`() BEGIN -- 封锁1分钟内请求超过50次的IP UPDATE zbp_access_log SET is_blocked = 1 WHERE ip_address IN ( SELECT ip_address FROM ( SELECT ip_address, COUNT() as request_count FROM zbp_access_log WHERE request_time >= DATE_SUB(NOW(), INTERVAL 1 MINUTE) GROUP BY ip_address HAVING request_count > 50 ) AS temp ); -- 删除7天前的日志 DELETE FROM zbp_access_log WHERE request_time < DATE_SUB(NOW(), INTERVAL 7 DAY); END$$ DELIMITER ; ```通过crontab设置每5分钟执行一次封锁检查:
``` 编辑crontab crontab -e 添加以下行 /5 /usr/bin/php /path/to/your/zblog/check_block.php ```创建check_block.php文件:
``` db->query("CALL block_malicious_ips()"); // 获取被封锁的IP并更新防火墙规则 $blocked_ips = $zbp->db->query("SELECT DISTINCT ip_address FROM zbp_access_log WHERE is_blocked = 1"); foreach ($blocked_ips as $ip) { // 更新iptables规则 exec("iptables -A INPUT -s {$ip['ip_address']} -j DROP"); // 记录到日志 $zbp->db->query("INSERT INTO zbp_block_log (ip_address, block_time, reason) VALUES ('{$ip['ip_address']}', NOW(), '自动封锁')"); } ?> ```创建monitor.php文件用于实时监控:
``` 0, 'blocked_requests' => 0, 'top_attackers' => array() ); // 获取最近1小时数据 $sql = "SELECT ip_address, COUNT() as request_count, SUM(CASE WHEN is_blocked = 1 THEN 1 ELSE 0 END) as blocked_count FROM zbp_access_log WHERE request_time >= DATE_SUB(NOW(), INTERVAL 1 HOUR) GROUP BY ip_address ORDER BY request_count DESC LIMIT 10"; $result = $zbp->db->query($sql); while ($row = $zbp->db->fetch($result)) { $stats['top_attackers'][] = $row; $stats['total_requests'] += $row['request_count']; $stats['blocked_requests'] += $row['blocked_count']; } // 输出监控信息 echo "总请求数: " . $stats['total_requests'] . "\n"; echo "已拦截请求: " . $stats['blocked_requests'] . "\n"; echo "拦截率: " . round(($stats['blocked_requests'] / $stats['total_requests']) 100, 2) . "%\n"; echo "\nTop 10 攻击IP:\n"; foreach ($stats['top_attackers'] as $attacker) { echo $attacker['ip_address'] . " - " . $attacker['request_count'] . "次请求\n"; } ?> ```创建报警脚本alert.php:
``` = DATE_SUB(NOW(), INTERVAL 1 HOUR) GROUP BY ip_address HAVING count > $threshold"; $result = $zbp->db->query($sql); if ($zbp->db->num_rows($result) > 0) { // 发送邮件报警 $to = "admin@yourdomain.com"; $subject = "ZBlog安全警报 - 检测到异常访问"; $message = "检测到以下IP异常访问:\n\n"; while ($row = $zbp->db->fetch($result)) { $message .= "IP: " . $row['ip_address'] . " - " . $row['count'] . "次请求\n"; } mail($to, $subject, $message); // 记录到系统日志 error_log("安全警报: " . $message, 3, "/var/log/zblog_security.log"); } ?> ```将以上所有配置完成后,你的ZBlog网站已经具备了完整的恶意访问防护能力。定期检查监控日志,根据实际情况调整阈值参数,即可持续保障网站安全。
易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图