Как защитить Ваш сайт от DoS-атаки? DoS основана на чрезмерно большом количестве запросов к сайту, в следствии чего перегруженный сервер не может принимать новые запросы, т.е. отказывает в обслуживании новые пользовательские запросы - отсюда и название метода (Denial of Service, отказ в обслуживании)
Существеет много различных способов защиты, как технических, так и программных. Стоит отметить, что при целевой серъезной атаке группой подготовленных хакеров, Вас вероятно ничего не спасет - такие атаки проводят, часто успешно, даже на такие сайты, как Майкрософт и ей подобные. Ведь даже на пару минут обрушить сайт таких компаний - это достижение с далеко идущими последствиями.
Впрочем, защитится от "обчных" хакерских атак (которые, тем не менее, не стоит недооценивать) можно достоточно просто - ниже приведен PHP-скрипт, который подсчитывает количество и частоту обращений с одного IP-адреса и, если таковых слишком много (что есть признак начала атаки) - отклоняет запросы с этого адреса. Стоит отметить, что данный скрипт защищает Ваш сайт только программно, т.е. защищает веб-сервер от чрезмерной нагрузки исполнения, поскольку запросы от атакующей стороны всё-равно будут поступть машине и серверу, но по крайней мере, сервер намного снизит свою нагрузку, не генирируя зазря страницы, тратя на это память и ресурсы процессора.
Итак, скрипт:
<?php
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);
}
}
}
?>
Для скрипта, как Вы видите, необходима БД с соответствующей таблицей и полями, составить которую не составит труда - оставляем Вам, как домашнее задание.