admin 发表于 2021-2-22 21:53:06

Discuz!修改相关文件防御CC攻击机制

在discuz的config/config_global.php配置文件中可以配置attackevasive参数开启CC 攻击防御
$_config['security']['attackevasive'] = 0;                // CC 攻击防御 1|2|4|8当你的站点发现被CC攻击时,你也可以在config中打开CC攻击防御,该防御有1/2/4/8四种防御方式,每个数字的意义为:
0表示关闭此功能
1表示cookie刷新限制
2表示限制代理访问
4表示二次请求
8表示回答问题(第一次访问时需要回答问题)
正常情况下设置为 0,在遭到攻击时,分析其攻击手法和规律,组合使用。 可以尝试先设置为 2, 2|4, 1|2|4|, 1|2|4|8, 如果 1|2|4|8 还不行,应用程序层面上已经抵挡不住,可能主机遭受的攻击来自于僵尸网络的 DDOS 攻击了,建议从防火墙策略上入手。
由于此项配置是针对所有访问者的,隐藏一旦发生误判将会影响网站的访问性,以及影响搜索引擎的抓取!
本文通过修改discuz文件,实现忽略指定ip段和搜索引擎不受此安全策略影响!
1、修改文件

2、修改方法

独家记忆 发表于 2021-2-22 21:53:14

1024这牛逼了吗,都有专门的推官员了

Discuz智能体 发表于 2025-3-18 02:03:18

在Discuz!中,`attackevasive`参数确实可以用来防御CC攻击,但正如你所提到的,这个配置是针对所有访问者的,可能会影响到正常的用户和搜索引擎的抓取。为了避免这种情况,我们可以通过修改Discuz!的源代码来实现忽略指定IP段和搜索引擎的访问,使其不受`attackevasive`参数的影响。

### 1. 修改文件
我们需要修改的文件是 `source/class/discuz/discuz_application.php`,这是Discuz!的核心文件之一,负责处理请求和响应。

### 2. 修改方法
我们可以通过以下步骤来实现忽略指定IP段和搜索引擎的访问:

#### 2.1 打开 `source/class/discuz/discuz_application.php` 文件
找到以下代码段:

if($this->var['config']['security']['attackevasive'] && !$this->init_var['mobile']) {
    require_once libfile('misc/security', 'include');
    security::attackevasive($this->var['config']['security']['attackevasive']);
}

#### 2.2 修改代码
在调用 `security::attackevasive` 之前,添加一个条件判断,忽略指定IP段和搜索引擎的访问。修改后的代码如下:

if($this->var['config']['security']['attackevasive'] && !$this->init_var['mobile']) {
    // 获取客户端IP
    $client_ip = $this->var['clientip'];
   
    // 定义忽略的IP段和搜索引擎的User-Agent
    $ignored_ips = array('192.168.1.0/24', '10.0.0.0/8'); // 你可以根据需要修改这些IP段
    $ignored_user_agents = array('Googlebot', 'Baiduspider', 'bingbot', 'YandexBot'); // 你可以根据需要添加更多的搜索引擎User-Agent
   
    // 检查客户端IP是否在忽略的IP段中
    $ignore_ip = false;
    foreach ($ignored_ips as $ip_range) {
      if (ip_in_range($client_ip, $ip_range)) {
            $ignore_ip = true;
            break;
      }
    }
   
    // 检查User-Agent是否为搜索引擎
    $ignore_user_agent = false;
    $user_agent = $_SERVER['HTTP_USER_AGENT'];
    foreach ($ignored_user_agents as $agent) {
      if (strpos($user_agent, $agent) !== false) {
            $ignore_user_agent = true;
            break;
      }
    }
   
    // 如果IP或User-Agent在忽略列表中,则不启用CC攻击防御
    if (!$ignore_ip && !$ignore_user_agent) {
      require_once libfile('misc/security', 'include');
      security::attackevasive($this->var['config']['security']['attackevasive']);
    }
}

#### 2.3 添加 `ip_in_range` 函数
为了判断IP是否在指定的IP段中,我们需要添加一个 `ip_in_range` 函数。你可以在 `source/class/discuz/discuz_application.php` 文件的顶部添加以下代码:

function ip_in_range($ip, $range) {
    if (strpos($range, '/') === false) {
      $range .= '/32';
    }
    list($range, $netmask) = explode('/', $range, 2);
    $range_decimal = ip2long($range);
    $ip_decimal = ip2long($ip);
    $wildcard_decimal = pow(2, (32 - $netmask)) - 1;
    $netmask_decimal = ~ $wildcard_decimal;
    return (($ip_decimal & $netmask_decimal) == ($range_decimal & $netmask_decimal));
}

### 3. 保存并测试
保存修改后的文件,并上传到服务器。然后你可以通过访问网站并检查日志来确认修改是否生效。

### 4. 注意事项
- 修改核心文件可能会影响Discuz!的升级,因此在升级时需要特别注意,可能需要重新应用这些修改。
- 如果你不确定如何修改,建议在修改前备份文件,并在测试环境中进行测试。

通过以上步骤,你可以实现忽略指定IP段和搜索引擎的访问,使其不受`attackevasive`参数的影响,从而避免误判和影响正常用户的访问。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: Discuz!修改相关文件防御CC攻击机制