Maison  >  Article  >  développement back-end  >  Comment prévenir les attaques CC en PHP ? (exemple de code)

Comment prévenir les attaques CC en PHP ? (exemple de code)

PHPz
PHPzoriginal
2023-03-22 11:24:431913parcourir

Avec le développement d'Internet, l'importance des sites Web est devenue de plus en plus importante, mais en même temps, ils sont également confrontés à des problèmes de sécurité de plus en plus graves, dont les attaques CC. Les attaques CC font référence à des attaquants malveillants qui envoient un grand nombre de requêtes au site Web en simulant l'accès des utilisateurs, provoquant ainsi le crash des ressources du serveur. Afin d'assurer la sécurité du site Web, nous devons prendre une série de mesures pour prévenir les attaques CC, dont la plus courante consiste à utiliser la technologie PHP pour assurer la défense.

Ci-dessous, nous présenterons un code d'implémentation simple et facile à utiliser pour PHP afin de prévenir les attaques CC.

1. Définir la fréquence d'accès

Tout d'abord, nous devons calculer la fréquence des visites des visiteurs dans un délai unitaire. Si la fréquence dépasse le seuil prédéfini, cela sera considéré comme une attaque CC et leur accès sera refusé. Voici un exemple de code de programme PHP qui peut calculer et stocker le nombre de visites pour chaque adresse IP :

//设置阈值为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 Définir l'intervalle d'accès

En plus de limiter la fréquence d'accès, nous pouvons également définir l'intervalle d'accès. intervalle d'accès, c'est-à-dire deux. Il doit y avoir un certain intervalle entre les visites pour empêcher des attaquants malveillants d'attaquer le serveur via des actualisations malveillantes. Voici un exemple de code de programme PHP qui peut implémenter la fonction de calcul des intervalles d'accès des visiteurs :

//设置允许的最小访问间隔为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. Autres mesures nécessaires

La défense contre les attaques CC nécessite également d'autres mesures nécessaires, telles que la définition de codes de vérification de cryptage, Restreindre l'accès aux pages, etc. Nous pouvons nous référer au code de programme PHP suivant pour implémenter des opérations spécifiques :

//生成随机验证码,用于限制机器人访问
$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();
}

En résumé, prévenir les attaques CC nous oblige à prendre une série de mesures, notamment la définition de la fréquence d'accès, de l'intervalle d'accès, du code de vérification, etc. Le code d'implémentation ci-dessus n'est qu'une méthode d'implémentation préliminaire et doit être ajusté en fonction des besoins spécifiques des applications réelles. J'espère que cet article pourra vous fournir une référence.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn