AntiDoss
<?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 );
}
?>