要实现将黑客生成的垃圾链接统一返回404状态码,可以采取以下技术方案:
1. 服务器层面拦截方案(推荐)
=== Apache环境 ===
在.htaccess文件中添加:
- <IfModule mod_rewrite.c>
- RewriteEngine On
- # 拦截异常参数特征
- RewriteCond %{QUERY_STRING} \.php\/[a-z0-9]{10,} [NC,OR]
- RewriteCond %{QUERY_STRING} (eval|base64_encode|cmd) [NC]
- RewriteRule ^(.*)$ - [R=404,L]
- # 拦截异常路径
- RewriteCond %{REQUEST_URI} \/(data|images)\/[a-f0-9]{32}\.html$ [NC]
- RewriteRule .* - [R=404,L]
- </IfModule>
复制代码
=== Nginx环境 ===
在server配置块中添加:
- location ~* \.(php|html)/[a-z0-9]{16,} {
- return 404;
- }
- location ~* (eval|base64_encode|cmd) {
- return 404;
- }
- if ($query_string ~* "\.php\/[a-z0-9]{10,}") {
- return 404;
- }
复制代码
2. Discuz核心拦截方案
在/source/class/discuz/discuz_application.php约第188行后插入:
- // 检测异常URL参数
- $attack_patterns = array(
- '/\/[0-9a-f]{32}\.html/i',
- '/\/(data|images|static)\/[0-9a-z]{16,}/i',
- '/(cmd|wget|curl|uname|phpinfo)/i'
- );
- foreach($_GET as $key => $value){
- foreach($attack_patterns as $pattern){
- if(preg_match($pattern, $value) || preg_match($pattern, $key)){
- header('HTTP/1.1 404 Not Found');
- exit();
- }
- }
- }
复制代码
3. 伪静态规则增强
修改伪静态规则文件,在原有规则前增加拦截规则:
=== Apache示例 ===
- # 拦截非法后缀
- RewriteRule ^(forum|portal).+\.(exe|dll|sh)$ - [R=404,L]
- # 拦截异常参数结构
- RewriteCond %{QUERY_STRING} ^(.{50,})$ [NC]
- RewriteRule ^(forum|portal)\.php$ - [R=404,L]
复制代码
4. 文件监控方案
创建/source/function/url_scan.func.php:
- <?php
- if(!defined('IN_DISCUZ')) exit('Access Denied');
- function check_url_attack() {
- $uri = $_SERVER['REQUEST_URI'];
-
- // 检测URL长度超过200字符
- if(strlen($uri) > 200) {
- dheader('HTTP/1.1 404 Not Found');
- exit();
- }
-
- // 检测连续重复字符
- if(preg_match('/(\w)\1{8}/', $uri)) {
- dheader('HTTP/1.1 404 Not Found');
- exit();
- }
-
- // 检测非常用参数名
- $valid_params = array('mod','tid','fid','page','id');
- foreach($_GET as $key => $val){
- if(!in_array($key, $valid_params) && !preg_match('/^[a-z_]{1,8}$/', $key)){
- dheader('HTTP/1.1 404 Not Found');
- exit();
- }
- }
- }
复制代码
在全局入口文件(forum.php/portal.php等)顶部添加:
- require_once './source/function/url_scan.func.php';
- check_url_attack();
复制代码
5. 安全加固建议
- 检查data目录权限是否为755
- 删除非必要安装文件(install/index.php)
- 更新UCenter通信密钥
- 检查第三方插件目录是否存在异常文件
- 开启Discuz内置的防火墙功能
以上方案实施后,可通过以下方式验证效果:
- # 测试异常URL
- curl -I "http://yoursite.com/forum.php?hjkgfdswert34567"
- # 应返回HTTP/1.1 404 Not Found
- # 检测长URL
- curl -I "http://yoursite.com/portal.php?abcdefghijklmnopqrstuvwxyz"
- # 应触发404响应
复制代码
注:建议在修改前备份网站数据,并在测试环境中验证规则有效性。如遇到规则冲突,可根据实际URL结构调整正则表达式参数阈值。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。 |