Текущее время: 18 окт 2017, 11:31


Защита от DoS-атак

Защита от DoS-атак

Защита от DoS-атак

Сообщение jakal » 27 фев 2011, 18:15

Простая защита от DoS-атак с помощью MySQL:
Организовать простую защиту от DoS-атак для сайтов, использующих PHP + MySQL, можно следующим образом. В MySQL создается таблица (будем называть ее ip_check) с полями lasttime, count, ip (все поля — типа INTEGER, причем ip — первичный ключ). Сразу после подключения к базе данных выполняется проверка, есть ли для данного IP-адреса запись в таблице. Если записи нет, она создается, при этом в count пишется 1, в lasttime — текущее время. Если запись уже есть, то проверяется, когда она была сделана (поле lasttime), и если прошло менее определенного количества секунд, то поле count увеличивается на 1, в противном случае приравнивается единице, и производится обновление записи в таблице (записывается новый count и lasttime). Далее происходит проверка величины count, и если она превысила некоторое пороговое значение, выдается статус 500 (или 403 или 503), сообщение об ошибке, и выполнение скрипта завершается.

Таким образом, для выполнения проверки требуется всего одной таблица с предельно простой структурой и 2 запроса SQL. Также можно добавить еще одно поле status, в которое ставить 1, если IP-адрес забанен навсегда по каким-то причинам, и совместить проверку на DoS-атаки с проверкой на забаненные IP-адреса без добавления дополнительных запросов. При необходимости можно еще одним запросом добавить учет суммарной нагрузки за все время или нагрузки по подсетям.

Кроме того, перед завершением скрипта можно добавить проверку, сколько времени заняло его выполнение, и если оно превышает какую-то пороговую величину (например, 10 секунд), начислять этому IP-адресу “штрафные очки” (т.е. дополнительно увеличивать поле count).

В виде кода это можно представить следующим образом:

Код: Выделить всё
<?php
// $link -- соединение с БД, $ip_text -- IP-адрес
define('ALERT_TIME',300);
define('ALERT_COUNT',150); 

function check_dos($ip_text, $link)  {
  $ip=ip2long($ip_text);
  $res=mysql_query($link,'SELECT lasttime, count, status FROM ip_check WHERE ip="'.$ip.'"');
  if (mysql_num_rows($res)==0) { // нет такого IP
  $count=1;
  mysql_query($link,'INSERT INTO ip_check (lasttime,count,ip,status) VALUES ('.time().',1,"'.$ip.'",0)');
  }
else {
  $data=mysql_fetch_row($res);
  $status=$data[2];
  if ($status!=2 && ($data[0]<time()-ALERT_TIME || $data[1]<ALERT_COUNT)))   $count=1;
  elseif ($status!=2) { $count=$data[1]+1; if ($count>=ALERT_COUNT) $status=1; }
  if ($status!=2) {
    mysql_query($link,'UPDATE ip_check SET count='.$count,', status='.$status.', lasttime='.time().' WHERE ip="'.$ip.'"';
  }
  if ($status) {
    header($_SERVER['HTTP_PROTOCOL'].' 503 Temporary Unavailable');
    trigger_error('Превышено число допустимых запросов!',E_USER_ERROR);
  }
}
?>


Кроме того, периодически следует очищать базу от старых записей (например, по cron). Кроме того, если ожидается большая интенсивность атак, возможно, имеет смысл заменить UPDATE-запрос на последовательность DELETE/INSERT, но в этом случае необходимо будет регулярно проводить оптимизацию таблицы.

jakal

Автор темы
Аватара пользователя
Комментатор
 
Сообщения: [ 154 ]
Зарегистрирован: 26 фев 2011, 22:09
Благодарил (а): 2 раз.
Поблагодарили: 4 раз.

Защита от DoS-атак

Сообщение jadkeep » 27 фев 2011, 22:03

Защита работает на всех скриптах PHP или есть исключения ?

Аватара пользователя
Прохожий
 
Сообщения: [ 11 ]
Зарегистрирован: 13 фев 2011, 02:53
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Защита от DoS-атак

Сообщение jakal » 27 фев 2011, 22:07

jadkeep писал(а):Защита работает на всех скриптах PHP или есть исключения ?

ну должно на всех работать, здесь просто условие, что Ваш сайт должен быть подключен к MySQL, то есть должен использовать базу данных. Так как нужно создать таблицу.

jakal

Автор темы
Аватара пользователя
Комментатор
 
Сообщения: [ 154 ]
Зарегистрирован: 26 фев 2011, 22:09
Благодарил (а): 2 раз.
Поблагодарили: 4 раз.

Защита от DoS-атак

Сообщение jadkeep » 27 фев 2011, 22:24

Ну то что должна быть БД я понял. Просто есть смешанные скрипты PHP + HTML.
Часто встречаются по реселерским программам.

Аватара пользователя
Прохожий
 
Сообщения: [ 11 ]
Зарегистрирован: 13 фев 2011, 02:53
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Защита от DoS-атак

Сообщение matokz » 30 апр 2011, 23:33

jadkeep писал(а):Просто есть смешанные скрипты PHP + HTML


Разве можно обойтись без html на сайтах с использованием php? :?:

Аватара пользователя
Прохожий
 
Сообщения: [ 11 ]
Зарегистрирован: 30 апр 2011, 19:06
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Защита от DoS-атак

Сообщение HAMMER » 30 апр 2011, 23:36

можно, но никакой структуры это иметь не будет :)
АКЦИЯ: Каждому флудеру/оффтопщику - день бана в подарок! Приведи с собой друга и отгреби за двоих!

VIP группа на форуме BestCoding.info

FAQ по SEO (постепенно пополняется)
Мой любимый форум phpBB

Аватара пользователя
Администратор
 
Сообщения: [ 930 ]
Зарегистрирован: 20 янв 2011, 13:54
Откуда: Зеленоград
Благодарил (а): 9 раз.
Поблагодарили: 85 раз.


Вернуться в PHP и базы данных

Кто сейчас на конференции

Зарегистрированные пользователи: нет зарегистрированных пользователей