1

Тема: Модуль захисту від DoS атак

Суть така:
Адмін в невеличкій панелі вказує кількість записів часу зверення до сервера та мінімально дозволений інтервал між всіма ними з точністю до мсек.
І якщо перевищується інтервал часу між N записами,то ip блокується через .htaccess

Наприклад:

Кількість записів: 5
Інтервал: 0.5

Між 5 записами часу звернення до сервера перевіриться інтервал і якщо він скрізь буде менше 0.5 сек.,то IP користувача блокується записом в .htaccess,видаючи користувачеві з цим IP помилку 403,що значно знижує навантаження на сервер/хост.

Працює на файлах,звернення пишуться в окремі файли для кожного IP.
Якщо IP попадає в бан,то файл логування для нього видаляється,щоб не засмічувати пам'ять.

Встановлення:

Розпакувати в корінь хоста,знайти або створити (якщо немає) php файл,який підключається на всіх сторінках вашого сайту,наприклад файл бд і на початку підключити модуль наступним чином:

<?php
require $_SERVER['DOCUMENT_ROOT'].'/antidos.php';
//ваш код...

Архів нижче,тестуйте

Подякували: 0xDADA11C7, Q-bart2

2

Re: Модуль захисту від DoS атак

Викладайте скріншоти

3 Востаннє редагувалося VTrim (13.02.2015 17:53:32)

Re: Модуль захисту від DoS атак

0xDADA11C7 написав:

Викладайте скріншоти

Що там викладати?
Сторінку 403 чи адмінку з двох форм? Там нічого осоливого немає.
Код antidos.php

<?php

  define('_ROOT_',$_SERVER['DOCUMENT_ROOT']);
  define('_IP_',$_SERVER['REMOTE_ADDR']);
  define('_INTERV_',file_get_contents(_ROOT_.'/ip_admin/interv.dat'));
  
  file_exists(_ROOT_.'/ip_logs/'._IP_.'.dat') || file_put_contents(_ROOT_.'/ip_logs/'._IP_.'.dat',null);
  (array) $lIP = file(_ROOT_.'/ip_logs/'._IP_.'.dat');
  (int) $cIP = count($lIP);
  if($cIP >= file_get_contents(_ROOT_.'/ip_admin/lim.dat')) 
  {
  for($i=0; $i<$cIP; ++$i)
  {
  (string) $cVal .= round(($lIP[$i+1] - $lIP[$i]),4) < _INTERV_ ? 'd' : 'n';
  } 
  (string) $nVal = substr($cVal,0,strlen($cVal)-1);
  if(!strstr($nVal,'n'))
  {  
  file_put_contents(_ROOT_.'/.htaccess',PHP_EOL.'deny from '._IP_.PHP_EOL,FILE_APPEND);
  unlink(_ROOT_.'/ip_logs/'._IP_.'.dat');
  exit('Ваш IP заблоковано!');
  }
  file_put_contents(_ROOT_.'/ip_logs/'._IP_.'.dat',null);
  }
  file_put_contents(_ROOT_.'/ip_logs/'._IP_.'.dat',microtime(true).PHP_EOL,FILE_APPEND);

Код адмінки

<?php
 
(string) $MyPassword = 'VTrim';

if($_GET['password']) {
 
if($MyPassword == $_GET['password']) { 

if($_POST['save'])
{
(int)$interv = (float)$_POST['interv'];
(int)$lim = (int)$_POST['lim'];
file_put_contents($_SERVER['DOCUMENT_ROOT'].'/ip_admin/interv.dat',$interv);
file_put_contents($_SERVER['DOCUMENT_ROOT'].'/ip_admin/lim.dat',$lim);
echo 'Дані збережені!<br>';
}
 
echo '<form method="POST">
Дозволений інтервал між запитами:
<br>
<input type="text" name="interv" value="'.file_get_contents('interv.dat').'">  сек.
<br>Ліміт запитів для перевірки:<br>
<input type="text" name="lim" value="'.file_get_contents('lim.dat').'">
<br>
<input type="submit" name="save" value="Зберегти">';
}
else 
{ 
echo 'Невірний пароль!'; 
}
}
else
{
echo '<table width=20% border=1><td>
      <form method="GET">
      Введіть пароль: <input type="password" name="password">
      <input type="submit" value="Увійти">
      </form>
      </td></table>';
}

4 Востаннє редагувалося quez (13.02.2015 19:25:51)

Re: Модуль захисту від DoS атак

Чому ви не форматуєте код? Це як вийти з голим задом на вулицю.

А ваше 'd':'n' - чистої води бидлокод. Вам для таких штук дали логічні змінні та оператори, використання яких в цьому коді було б прозорим та очевидним, що не можна сказати про ваші рядки.

Ну і код

 
$isRangShort = true;
for($i=0; $i<$cIP; ++$i)
{
    $isRangeShort = $isRangeShort && round(($lIP[$i+1] - $lIP[$i]),4) < _INTERV_;  //хто може обґрунтувати round?
}
if($israngeShort){// а далі все те ж

А, ще ж є substr від 0 до кінця рядка. Але тут я не впевнений, що це не який-небудь чисто пхпшний хук .

Подякували: mike1

5

Re: Модуль захисту від DoS атак

quez написав:

Чому ви не форматуєте код? Це як вийти з голим задом на вулицю.

:D  :D  Взяв собі на замітку

6

Re: Модуль захисту від DoS атак

muhasjo написав:
quez написав:

Чому ви не форматуєте код? Це як вийти з голим задом на вулицю.

:D  :D  Взяв собі на замітку

Ви сам нудист чи маєте знайомих нудистів?

7

Re: Модуль захисту від DoS атак

Що за дискримінація нудистів?

8

Re: Модуль захисту від DoS атак

quez написав:

Чому ви не форматуєте код? Це як вийти з голим задом на вулицю.

А ваше 'd':'n' - чистої води бидлокод. Вам для таких штук дали логічні змінні та оператори, використання яких в цьому коді було б прозорим та очевидним, що не можна сказати про ваші рядки.

Ну і код

 
$isRangShort = true;
for($i=0; $i<$cIP; ++$i)
{
    $isRangeShort = $isRangeShort && round(($lIP[$i+1] - $lIP[$i]),4) < _INTERV_;  //хто може обґрунтувати round?
}
if($israngeShort){// а далі все те ж

А, ще ж є substr від 0 до кінця рядка. Але тут я не впевнений, що це не який-небудь чисто пхпшний хук .

true/false не підійде,тому,що якщо Ви не помітили,та там .=,а не просто =,йде доповнення рядка,а далі перевірка на присутність 'n'.

9

Re: Модуль захисту від DoS атак

VTrim написав:
quez написав:

Чому ви не форматуєте код? Це як вийти з голим задом на вулицю.

А ваше 'd':'n' - чистої води бидлокод. Вам для таких штук дали логічні змінні та оператори, використання яких в цьому коді було б прозорим та очевидним, що не можна сказати про ваші рядки.

Ну і код

 
$isRangShort = true;
for($i=0; $i<$cIP; ++$i)
{
    $isRangeShort = $isRangeShort && round(($lIP[$i+1] - $lIP[$i]),4) < _INTERV_;  //хто може обґрунтувати round?
}
if($israngeShort){// а далі все те ж

А, ще ж є substr від 0 до кінця рядка. Але тут я не впевнений, що це не який-небудь чисто пхпшний хук .

true/false не підійде,тому,що якщо Ви не помітили,та там .=,а не просто =,йде доповнення рядка,а далі перевірка на присутність 'n'.

Все я помітив, ви ж бачите, що я теж не просто присвоюю результат порівняння, а складаю його з отриманим раніше. І в кінці ви отримаєте, наприклад dddnd, а я — true&&true&&true&&true&&false&&true.

10 Востаннє редагувалося VTrim (13.02.2015 21:23:22)

Re: Модуль захисту від DoS атак

Зараз перевірю

11

Re: Модуль захисту від DoS атак

П’ятниця, туди її. Нам обом зовсім необов’язково складати всі значення, достатньо при умові перевищення максимального часу виставити флаг в 'n' або false.

12 Востаннє редагувалося VTrim (13.02.2015 22:18:04)

Re: Модуль захисту від DoS атак

Шось не працює воно правильно з тру/фолс. І ваші варіанти в тому числі.

13

Re: Модуль захисту від DoS атак

Код в студію, і випадки, в яких не спрацьовує.

14

Re: Модуль захисту від DoS атак

Мені цікаво,як ви так сміливо можете радити свій код,назвавши мій бидлокодом,при цьому навіть не перевіривши як воно працює і чи працює ваш варіант взагалі. Мене дивують такі форумчани.

15

Re: Модуль захисту від DoS атак

Так добийте мене остаточно: покажіть, де ваш код працює, а мій ні.

16

Re: Модуль захисту від DoS атак

quez написав:
muhasjo написав:
quez написав:

Чому ви не форматуєте код? Це як вийти з голим задом на вулицю.

:D  :D  Взяв собі на замітку

Ви сам нудист чи маєте знайомих нудистів?

Не в нудистах справа, тут краще пасувало б, не причесаним вийти на вулицю . Якщо голий зад, значить, щось серйозно напартачено і не замічено. Але то таке.

На рахунок форматування, то в редакторі воно то може відформатоване виглядає, а при вставці на сторінку все зїжджає, і впадло     розсовувати,  бо клавіша tab не так працює як би хотілося, а пробіли це зло, imho.

17

Re: Модуль захисту від DoS атак

Пане VTrim, доведіть почату справу до кінця і вкажіть на мою некомпетентність прикладами. Або вибачтесь.

18

Re: Модуль захисту від DoS атак

quez написав:

Пане VTrim, доведіть почату справу до кінця і вкажіть на мою некомпетентність прикладами. Або вибачтесь.

Мушу вибачитись.
Спочатку тестував,завжди повертало false,потім при var_dump($isRangeShort) перший запис завжди був true,хоча мало бути false і тільки сьогодні ще раз перевірив,все стало ок. Дякую.

19

Re: Модуль захисту від DoS атак

Далі видалення IP з блоку (файлу .htaccess)

Гляньте чи тут не набидлокодив :)
Початковий код..

<?php

(string) $ip = '68.5.71.42';
   
(array) $file = file('.htaccess');
(string) $ip_str = 'deny from '.$ip;

if(in_array($ip_str,$file))
{
(string) $del_ip = str_replace($ip_str,null,implode($file));
file_put_contents('.htaccess',$del_ip);
echo 'IP видалений з блоку!';
}
else
{
echo 'Такий IP не заблокований';
}

20 Востаннє редагувалося Sensetivity (14.02.2015 17:29:27)

Re: Модуль захисту від DoS атак

VTrim написав:

Далі видалення IP з блоку (файлу .htaccess)

Гляньте чи тут не набидлокодив :)
Початковий код..

<?php

(string) $ip = '68.5.71.42';
   
(array) $file = file('.htaccess');
(string) $ip_str = 'deny from '.$ip;

if(in_array($ip_str,$file))
{
(string) $del_ip = str_replace($ip_str,null,implode($file));
file_put_contents('.htaccess',$del_ip);
echo 'IP видалений з блоку!';
}
else
{
echo 'Такий IP не заблокований';
}

А я думав у мене фіговий код.
(string) $ip = '68.5.71.42'; і так рядок, нащо тут ота "стрінґ" ?
(array) $file = file('.htaccess'); file() і так повертає масив, нащо тут "аррей" ?
(string) $ip_str = 'deny from '.$ip; Див №1

<?php

$ip = '68.5.71.42';
$file = file('.htaccess');
$ip_str = 'deny from ' . $ip;

if (in_array($ip_str, $file)) {
    $del_ip = str_replace($ip_str, null, implode($file));
    file_put_contents('.htaccess', $del_ip);
    echo 'IP видалений з блоку!';
} else {
    echo 'Такий IP не заблокований';
}

Уже гарніше та зрозуміліше.