> 백엔드 개발 > PHP 문제 > PHP에서 CC 공격을 방지하는 방법은 무엇입니까? (코드 예)

PHP에서 CC 공격을 방지하는 방법은 무엇입니까? (코드 예)

PHPz
풀어 주다: 2023-03-22 12:04:02
원래의
1961명이 탐색했습니다.

인터넷의 발달과 함께 웹사이트의 중요성은 더욱 부각되고 있지만, 동시에 CC 공격 등 보안 문제도 점점 심각해지고 있습니다. CC 공격은 악의적인 공격자가 사용자 액세스를 시뮬레이션하여 웹 사이트에 대량의 요청을 보내 서버 리소스가 중단되는 것을 말합니다. 웹사이트의 보안을 보장하기 위해 CC 공격을 방지하기 위한 일련의 조치를 취해야 하며, 가장 일반적인 방법은 방어를 위해 PHP 기술을 사용하는 것입니다.

아래에서는 CC 공격을 방지하기 위한 간단하고 사용하기 쉬운 PHP 구현 코드를 소개하겠습니다.

1. 접속 빈도 설정

먼저, 단위 시간 내 방문자의 방문 빈도를 계산해야 합니다. 빈도가 미리 설정된 임계값을 초과하면 CC 공격으로 간주되어 접속이 거부됩니다. 다음은 각 IP 주소에 대한 방문 횟수를 계산하고 저장할 수 있는 PHP 프로그램 코드의 예입니다.

//设置阈值为100次/分钟
$throttle=100;
//获取访问者的IP地址
$ip=$_SERVER['REMOTE_ADDR'];
//获取当前时间的时间戳
$time=time();
//读取ip_access.log文件记录的IP地址访问次数
$log=file_get_contents("ip_access.log");
//将读取到的记录解析成数组
$log_arr=explode("\n",$log);
//初始化访问次数为0
$access_num=0;
//循环数组,查找当前访问IP地址的访问记录
foreach($log_arr as $access_log){
    $access_ip=explode("|",$access_log);
    if($access_ip[0]==$ip){
        $access_num=$access_ip[1];
        break;
    }
}
//计算这一分钟内的启动时间
$start_time=$time-60;
//将时间戳和访问次数以"|"的形式拼接成字符串,并存入ip_access.log文件
$log_str=$ip."|".($access_num+1)."\n";
file_put_contents("ip_access.log",$log_str,FILE_APPEND);
//获取这一分钟内所有IP地址的访问次数总和
$access_all=0;
foreach($log_arr as $access_log){
    $access_ip=explode("|",$access_log);
    if($access_ip[1]>0 && $access_ip[0]!=$ip && $access_ip[2]>$start_time){
        $access_all+=$access_ip[1];
    }
}
//如果访问次数超过了阈值,就将其视为CC攻击,停止访问
if($access_all>$throttle){
    die();
}
로그인 후 복사

2. 액세스 간격 설정

접속 빈도를 제한하는 것 외에도 접속 간격, 즉 2 악의적인 공격자가 악의적인 새로 고침을 통해 서버를 공격하는 것을 방지하려면 방문 간에 일정한 간격이 필요합니다. 다음은 방문자 접속 간격 계산 기능을 구현할 수 있는 PHP 프로그램 코드의 예입니다.

//设置允许的最小访问间隔为3秒
$interval=3;
//获取访问者的IP地址
$ip=$_SERVER["REMOTE_ADDR"];
//获取当前时间的时间戳
$time=time();
//读取ip_access_time.log文件记录的IP地址的最近访问时间
$log=file_get_contents("ip_access_time.log");
//将读取到的记录解析成数组
$log_arr=explode("\n",$log);
//初始化最近访问时间为空
$last_access_time="";
//循环数组,查找当前访问IP地址的访问记录
foreach($log_arr as $access_time){
    $access_ip=explode("|",$access_time);
    if($access_ip[0]==$ip){
        $last_access_time=$access_ip[1];
        break;
    }
}
//如果最近访问时间不为空,并且与当前时间的差值小于设置的间隔时间,就将其视为CC攻击,停止访问
if(!empty($last_access_time) && ($time-$last_access_time)<$interval){
    die();
}
//将当前时间的时间戳以"|"的形式拼接成字符串,并存入ip_access_time.log文件
$log_str=$ip."|".$time."\n";
file_put_contents("ip_access_time.log",$log_str,FILE_APPEND);
로그인 후 복사

3. 기타 필요한 조치

CC 공격에 대한 방어에도 암호화 인증 코드 설정, 페이지 등에 대한 액세스를 제한합니다. 특정 작업을 구현하려면 다음 PHP 프로그램 코드를 참조할 수 있습니다.

//生成随机验证码,用于限制机器人访问
$captcha=rand(1000,9999);
//将验证码保存到session中,方便后期验证
session_start();
$_SESSION["captcha"]=$captcha;
//设置验证码图片的大小和颜色
$img_width=50;
$img_height=25;
$background_color=imagecolorallocate($img,238,238,238);
$text_color=imagecolorallocate($img,0,0,0);
//将验证码以图片形式输出
header("Content-type:image/png");
$img=imagecreate($img_width,$img_height);
imagefill($img,0,0,$background_color);
imagestring($img,5,10,5,$captcha,$text_color);
imagepng($img);
imagedestroy($img);
//限制特定的IP地址访问特定的页面
$ip=$_SERVER["REMOTE_ADDR"];
if($ip=="192.168.1.1"){
    die();
}
로그인 후 복사

요약하자면 CC 공격을 방지하려면 액세스 빈도, 액세스 간격, 인증 코드 설정 등을 포함한 일련의 조치를 취해야 합니다. 위의 구현 코드는 단지 예비 구현 방법일 뿐이며 실제 응용 프로그램의 특정 요구에 따라 조정되어야 합니다. 이 글이 여러분에게 참고가 될 수 있기를 바랍니다.

위 내용은 PHP에서 CC 공격을 방지하는 방법은 무엇입니까? (코드 예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿