Добро пожаловать, Гость!
Просмотр записи
Reactor создал дневник Защита от DDoS в категории Полезные коды 21 Фев 2014
<?php
// каталог для хранения временных файлов
$nf_path=$dir.'/engine/data/anti_doss/';
// имя файла для юзера - генерится из его IP-адреса
$nf_fip=$nf_path.$_SERVER['REMOTE_ADDR'];
// имя файла для встроенного крона (должно начинаться с точки)
$nf_fcron=$nf_path.'.time';
//
// сек => кол-во
//
// не более скольки загрузок за сколько секунд можно сделать,
// чтобы не получить игнор
//
$nf_flood=array(
10 => 15, // не более 15 загрузок за 10 секунд
60 => 50, // не более 60 загрузок за минуту
300 => 150, // не более 150 загрузок за 5 минут
3600 => 500, // не более 500 загрузок за час
);
$nf_cron_run=300; // раз в сколько секунд проверять старые файлы
$nf_old_file=300; // через сколько секунд считать файл старым (и удалять)
function cron_update($fn,$update) {
if (!file_exists($fn)) {
if (!@touch($fn)) {
echo 'Не могу создать <strong>'.basename($fn).'</strong>, проверьте права на файлы (w+)<br/>';
return -1;
}
}
else {
if (time()-filemtime($fn)<$update) {return 0;}
}
$f=@fopen($fn,'r+');
if (!$f) {
echo 'Не могу открыть <strong>'.basename($fn).'</strong>, проверьте права на файлы (r+)<br/>';
return -1;
}
if (!flock($f,6)) {return;}
$text=fgets($f,100);
if (time()-intval($text)<$update) {return 0;}
fseek($f,0,SEEK_SET);
fwrite($f,time().' ');
fclose($f);
return 1;
}
$nf_cron_code=cron_update($nf_fcron,$nf_cron_run);
if ($nf_cron_code==-1) return;
if ($nf_cron_code==1) {
if ($nf_dir=@opendir($nf_path)) {
$nf_time=time()-$nf_old_file;
while (($nf_tmp=readdir($nf_dir))!==false) {
if ($nf_tmp[0]=='.') continue;
if (filemtime($nf_path.$nf_tmp)<$nf_time &&
preg_match("!^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$!",$nf_tmp))
{
if (!unlink($nf_path.$nf_tmp)) {
echo 'Не могу удалить <trong>'.$nf_tmp.'</strong><br/>';
}
}
}
closedir($nf_dir);
}
}
unset($nf_cron_code);
if (file_exists($nf_fip)) {
$nf_f=@fopen($nf_fip,'r+');
if (!flock($nf_f,6)) exit('Ошибка запущен паралельный процесс!');
if (!$nf_f) {
echo 'Не могу открыть <strong>'.basename($nf_fip).'</strong> (r+)<br/>';
return;
}
$nf_buf=fgets($nf_f,1000);
$nf_buf=explode('|',$nf_buf);
}
else {
for($nf_i=0; $nf_i<count($nf_flood)*2; $nf_i++) $nf_buf[]=0;
$nf_f=@fopen($nf_fip,'a+');
if (!$nf_f) {
echo 'Не могу создать <strong>'.basename($nf_fip).'</strong> (a+)<br/>';
return;
}
if (!flock($nf_f,6)) exit('Ошибка запущен паралельный процесс!');
}
$nf_i=0;
$nf_stopflag=0;
foreach ($nf_flood as $nf_k=>$nf_v) {
if ($nf_buf[$nf_i+1]+$nf_k<time()) {
$nf_buf[$nf_i]=1;
$nf_buf[$nf_i+1]=time();
}
else {
if ($nf_buf[$nf_i]>$nf_v) {
$nf_stopflag=1;
$nf_buf[$nf_i+1]=time();
}
$nf_buf[$nf_i]++;
}
$nf_i+=2;
}
ftruncate($nf_f,0);
fseek($nf_f,0);
fputs($nf_f,implode('|',$nf_buf));
if ($nf_stopflag) exit('Сработала программа ANTI DOSS.. Это значит что вы либо хотели взломать сайт, либо очень быстро передвигались по сайту... Доступ к сайту возобновиться в течении 5минут');
unset($nf_f);
unset($nf_i);
unset($nf_k);
unset($nf_v);
unset($nf_stopflag);
unset($nf_buf);
unset($nf_fip);
unset($nf_path);
unset($nf_flood);
unset($nf_cron_run);
unset($nf_cron_idle);
}
?>
<?php
// каталог для хранения временных файлов
$nf_path=$dir.'/engine/data/anti_doss/';
// имя файла для юзера - генерится из его IP-адреса
$nf_fip=$nf_path.$_SERVER['REMOTE_ADDR'];
// имя файла для встроенного крона (должно начинаться с точки)
$nf_fcron=$nf_path.'.time';
//
// сек => кол-во
//
// не более скольки загрузок за сколько секунд можно сделать,
// чтобы не получить игнор
//
$nf_flood=array(
10 => 15, // не более 15 загрузок за 10 секунд
60 => 50, // не более 60 загрузок за минуту
300 => 150, // не более 150 загрузок за 5 минут
3600 => 500, // не более 500 загрузок за час
);
$nf_cron_run=300; // раз в сколько секунд проверять старые файлы
$nf_old_file=300; // через сколько секунд считать файл старым (и удалять)
function cron_update($fn,$update) {
if (!file_exists($fn)) {
if (!@touch($fn)) {
echo 'Не могу создать <strong>'.basename($fn).'</strong>, проверьте права на файлы (w+)<br/>';
return -1;
}
}
else {
if (time()-filemtime($fn)<$update) {return 0;}
}
$f=@fopen($fn,'r+');
if (!$f) {
echo 'Не могу открыть <strong>'.basename($fn).'</strong>, проверьте права на файлы (r+)<br/>';
return -1;
}
if (!flock($f,6)) {return;}
$text=fgets($f,100);
if (time()-intval($text)<$update) {return 0;}
fseek($f,0,SEEK_SET);
fwrite($f,time().' ');
fclose($f);
return 1;
}
$nf_cron_code=cron_update($nf_fcron,$nf_cron_run);
if ($nf_cron_code==-1) return;
if ($nf_cron_code==1) {
if ($nf_dir=@opendir($nf_path)) {
$nf_time=time()-$nf_old_file;
while (($nf_tmp=readdir($nf_dir))!==false) {
if ($nf_tmp[0]=='.') continue;
if (filemtime($nf_path.$nf_tmp)<$nf_time &&
preg_match("!^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$!",$nf_tmp))
{
if (!unlink($nf_path.$nf_tmp)) {
echo 'Не могу удалить <trong>'.$nf_tmp.'</strong><br/>';
}
}
}
closedir($nf_dir);
}
}
unset($nf_cron_code);
if (file_exists($nf_fip)) {
$nf_f=@fopen($nf_fip,'r+');
if (!flock($nf_f,6)) exit('Ошибка запущен паралельный процесс!');
if (!$nf_f) {
echo 'Не могу открыть <strong>'.basename($nf_fip).'</strong> (r+)<br/>';
return;
}
$nf_buf=fgets($nf_f,1000);
$nf_buf=explode('|',$nf_buf);
}
else {
for($nf_i=0; $nf_i<count($nf_flood)*2; $nf_i++) $nf_buf[]=0;
$nf_f=@fopen($nf_fip,'a+');
if (!$nf_f) {
echo 'Не могу создать <strong>'.basename($nf_fip).'</strong> (a+)<br/>';
return;
}
if (!flock($nf_f,6)) exit('Ошибка запущен паралельный процесс!');
}
$nf_i=0;
$nf_stopflag=0;
foreach ($nf_flood as $nf_k=>$nf_v) {
if ($nf_buf[$nf_i+1]+$nf_k<time()) {
$nf_buf[$nf_i]=1;
$nf_buf[$nf_i+1]=time();
}
else {
if ($nf_buf[$nf_i]>$nf_v) {
$nf_stopflag=1;
$nf_buf[$nf_i+1]=time();
}
$nf_buf[$nf_i]++;
}
$nf_i+=2;
}
ftruncate($nf_f,0);
fseek($nf_f,0);
fputs($nf_f,implode('|',$nf_buf));
if ($nf_stopflag) exit('Сработала программа ANTI DOSS.. Это значит что вы либо хотели взломать сайт, либо очень быстро передвигались по сайту... Доступ к сайту возобновиться в течении 5минут');
unset($nf_f);
unset($nf_i);
unset($nf_k);
unset($nf_v);
unset($nf_stopflag);
unset($nf_buf);
unset($nf_fip);
unset($nf_path);
unset($nf_flood);
unset($nf_cron_run);
unset($nf_cron_idle);
}
?>
DCMS-Social.ru - движок социальной сети, вап и веб мастерская, файло-обменник и форум.
Статистика DCMS-Social.ru: Пользователей - 14967, тем на форуме - 30292, сообщений - 298885