{% else-1 %}
Простая защита от 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);  }}?>
-5 47 0
0

Нет фото
Shop * 0.13
• 1 окт 2014, 08:04


С такой защитой сайт скорее и без ддоса ляжет

0

Нет фото
denis_s * 2.45
• 20 авг 2014, 22:34


хреновая защита, тем более еще раз повторю, защита от ддос создается не на таком уровне *

0

Нет фото
lmfao * 5.19
• 20 авг 2014, 19:14


Копипаст http://htmlweb.ru/php/example/anti_dos_atak.php

0

Нет фото
• 20 авг 2014, 14:57


DarkAKC, Х2

0

Нет фото
DarkAKC * 1.47
• 20 авг 2014, 14:30


Я под столом * эта "защита" только ускорит падение сайта