使用Discuz!自带参数防御CC攻击以及原理
CC攻击确实是很蛋疼的一种攻击方式,Discuz!的配置文件中已经有了一个自带的减缓CC攻击的参数,在配置文件config.inc.php中:
1 2 | $attackevasive = 0; // 论坛防御级别,可防止大量的非正常请求造成的拒绝服务攻击 // 防护大量正常请求造成的拒绝服务攻击, |
这个参数可以设置的值有:
1 2 3 4 5 | 0表示关闭此功能 1表示cookie刷新限制 2表示限制代理访问 4表示二次请求 8表示回答问题(第一次访问时需要回答问题) |
正常情况下设置为 0,在遭到攻击时,分析其攻击手法和规律,组合使用。 可以尝试先设置为 2, 2|4, 1|2|4|, 1|2|4|8, 如果 1|2|4|8 还不行,应用程序层面上已经抵挡不住,可能主机遭受的攻击来自于僵尸网络的 DDOS 攻击了,建议从防火墙策略上入手。
在source/class/class_core.php文件中可以找到如下代码:
1 2 3 | if ( $this ->config[ 'security' ][ 'attackevasive' ] && (!defined( 'CURSCRIPT' ) || !in_array( $this -> var [ 'mod' ], array ( 'seccode' , 'secqaa' , 'swfupload' )))) { require_once libfile( 'misc/security' , 'include' ); } |
$this->config[‘security’][‘attackevasive’]为config_global.php文件里设置的$_config[‘security’][‘attackevasive’]的值。
找到source/misc/misc_security.php文件
1 2 3 4 5 6 7 8 9 10 11 12 13 | if ( is_string ( $this ->config[ 'security' ][ 'attackevasive' ])) { //如果$this->config['security']['attackevasive']是字符串 $attackevasive_tmp = explode ( '|' , $this ->config[ 'security' ][ 'attackevasive' ]); 根据分隔符|分割 $this ->config[ 'security' ][ 'attackevasive' ]得到数组 $attackevasive_tmp $attackevasive = 0; foreach ( $attackevasive_tmp AS $key => $value ) { $attackevasive += intval ( $value ); //将数组$attackevasive中每项的值加起来得到$attackevasive } unset( $attackevasive_tmp ); } else { $attackevasive = $this ->config[ 'security' ][ 'attackevasive' ]; } |
1 | $lastrequest = isset( $_G [ 'cookie' ][ 'lastrequest' ]) ? authcode( $_G [ 'cookie' ][ 'lastrequest' ], 'DECODE' ) : '' ; |
获取上一次请求的时间。
$_G[‘cookie’][‘lastrequest’]为记录上一次请求时间的cookie。
1 2 3 | if ( $attackevasive & 1 || $attackevasive & 4) { dsetcookie( 'lastrequest' , authcode(TIMESTAMP, 'ENCODE' ), TIMESTAMP + 816400, 1, true); } |
如果设置的是cookie刷新限制($attackevasive & 1)或者二次请求($attackevasive & 4)的方式,那么创建以当前时间为值的上一次请求的cookie。
1 2 3 4 5 | if ( $attackevasive & 1) { if (TIMESTAMP - $lastrequest < 1) { securitymessage( 'attackevasive_1_subject' , 'attackevasive_1_message' ); } } |
cookie刷新限制的方式:当前时间-上一次请求的时间<1的时候会有页面重载的提示。
1 2 3 4 5 6 | if (( $attackevasive & 2) && ( $_SERVER [ 'HTTP_X_FORWARDED_FOR' ] || $_SERVER [ 'HTTP_VIA' ] || $_SERVER [ 'HTTP_PROXY_CONNECTION' ] || $_SERVER [ 'HTTP_USER_AGENT_VIA' ] || $_SERVER [ 'HTTP_CACHE_INFO' ] || $_SERVER [ 'HTTP_PROXY_CONNECTION' ])) { securitymessage( 'attackevasive_2_subject' , 'attackevasive_2_message' , FALSE); } |
限制代理访问的方式。
1 2 3 4 5 | if ( $attackevasive & 4) { if ( empty ( $lastrequest ) || TIMESTAMP - $lastrequest > 300) { securitymessage( 'attackevasive_4_subject' , 'attackevasive_4_message' ); } } |
二次请求的方式:当前时间-上一次请求时间>300秒的时候会有页面重载的提示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | if ( $attackevasive & 8) { list( $visitcode , $visitcheck , $visittime ) = explode ( '|' , authcode( $_G [ 'cookie' ][ 'visitcode' ], 'DECODE' )); if (! $visitcode || ! $visitcheck || ! $visittime || TIMESTAMP - $visittime > 60 * 60 * 4 ) { if ( empty ( $_POST [ 'secqsubmit' ]) || ( $visitcode != md5( $_POST [ 'answer' ]))) { $answer = 0; $question = '' ; for ( $i = 0; $i < rand(2, 5); $i ++) { $r = rand(1, 20); $question .= $question ? ' + ' . $r : $r ; $answer += $r ; } $question .= ' = ?' ; dsetcookie( 'visitcode' , authcode(md5( $answer ). '|0|' .TIMESTAMP, 'ENCODE' ), TIMESTAMP + 816400, 1, true); securitymessage( $question , '<input type="text" name="answer" size="8" maxlength="150" /><input type="submit" name="secqsubmit" class="button" value=" Submit " />' , FALSE, TRUE); } else { dsetcookie( 'visitcode' , authcode( $visitcode . '|1|' .TIMESTAMP, 'ENCODE' ), TIMESTAMP + 816400, 1, true); } } } |
回答问题的方式:第一次访问时需要回答问题。
转自:https://www.nigesb.com/discuz-cc-attacker-defence.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!